Android индекс студийного массива вне границ при попытке конвертировать растровое изображение в байтовый массив NV12 - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть растровое изображение, которое загружено из галереи устройства в 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. Приведенная ниже ошибка возникает в строках этой l oop в функции 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));
}

Может кто-нибудь подсказать любые поправки к коду, чтобы предотвратить ошибку «вне границ», помня, что размеры моего изображения (ширина и высота) могут различаться в зависимости от того, какое изображение загружено из галереи.

Чем к тебе

...