Индекс массива студии Android выходит за пределы при попытке преобразовать растровое изображение в байтовый массив NV12
У меня есть растровое изображение, которое загружается из галереи устройства в ImageView. Затем я хочу преобразовать это растровое изображение в байтовый массив NV12.
Я использую функцию, которую подключил к Интернету, чтобы выполнить преобразование, но при запуске кода я получаю ошибку индекса массива вне пределов, и я пытаюсь понять, почему.
Вот код, который вызывает функцию и передает ей растровое изображение с шириной и высотой.
public void prepareImage(Bitmap bitmap){
int intHeight = bitmap.getHeight();
int intWidth = bitmap.getWidth();
byte[] byteArray = getNV12(intWidth, intHeight, bitmap);
}
Вот функция getNV12:
public byte [] getNV12(int inputWidth, int inputHeight, Bitmap scaled) {
int [] argb = new int[inputWidth * inputHeight];
scaled.getPixels(argb, 0, inputWidth, 0, 0, inputWidth, inputHeight);
byte [] yuv = new byte[inputWidth*inputHeight*3/2];
encodeYUV420SP(yuv, argb, inputWidth, inputHeight);
scaled.recycle();
return yuv;
}
Вот функция encodeYUV420SP (вызываемая вышеуказанной функцией)
void encodeYUV420SP(byte[] yuv420sp, int[] argb, int width, int height) {
final int frameSize = width * height;
int yIndex = 0;
int uvIndex = frameSize;
int R, G, B, Y, U, V;
int index = 0;
for (int j = 0; j < height; j++) {
for (int i = 0; i < width; i++) {
R = (argb[index] & 0xff000000) >>> 24;
G = (argb[index] & 0xff0000) >> 16;
B = (argb[index] & 0xff00) >> 8;
// well known RGB to YUV algorithm
Y = ( ( 66 * R + 129 * G + 25 * B + 128) >> 8) + 16;
V = ( ( -38 * R - 74 * G + 112 * B + 128) >> 8) + 128; // Previously U
U = ( ( 112 * R - 94 * G - 18 * B + 128) >> 8) + 128; // Previously V
yuv420sp[yIndex++] = (byte) ((Y < 0) ? 0 : ((Y > 255) ? 255 : Y));
if (j % 2 == 0 && index % 2 == 0) {
yuv420sp[uvIndex++] = (byte)((V<0) ? 0 : ((V > 255) ? 255 : V));
yuv420sp[uvIndex++] = (byte)((U<0) ? 0 : ((U > 255) ? 255 : U));
}
index ++;
}
}
}
И вот ошибка, которую я получаю:
java.lang.ArrayIndexOutOfBoundsException: length=459607; index=459607
at com.example.jdapp.actUploadImage.encodeYUV420SP(actUploadImage.java:238)
Ширина изображения в этом случае составляет 495, а высота - 618. Ошибка, приведенная ниже, возникает в строках в этом цикле функции encodeYUV420SP, что означает, что индекс uvIndex в какой-то момент вышел за пределы:
if (j % 2 == 0 && index % 2 == 0) {
yuv420sp[uvIndex++] = (byte)((V<0) ? 0 : ((V > 255) ? 255 : V));
yuv420sp[uvIndex++] = (byte)((U<0) ? 0 : ((U > 255) ? 255 : U));
}
Может ли кто-нибудь предложить какие-либо поправки к коду, чтобы предотвратить ошибку за пределами границ, помня, что размеры моих изображений (ширина и высота) могут варьироваться в зависимости от того, какое изображение загружено из галереи.
Спасибо