Неправильные цвета на Android Растровое изображение после преобразования в и из байтового массива - PullRequest
0 голосов
/ 21 апреля 2020

В Android я хочу загрузить PNG, получить значения RGB в байтовом массиве для выполнения некоторых вычислений, а затем я хочу воссоздать растровое изображение с новыми значениями. Для этого я написал 2 функции для преобразования битовой карты в байтовый массив RGB и еще одну для преобразования байтового массива RGB обратно в битовую карту, альфа-канал можно игнорировать.

Это функции преобразования:

public static byte[] ARGB2byte(Bitmap img)
{
    int width = img.getWidth();
    int height = img.getHeight();

    int[] pixels = new int[height*width];
    byte rgbIm[] = new byte[height*width*3];

    img.getPixels(pixels,0,width,0,0,width,height);

    int pixel_count = 0;
    int count=width*height;

    while(pixel_count < count){
        int inVal = pixels[pixel_count];

        //Get the pixel channel values from int
        int a = (inVal >> 24) & 0xff;
        int r = (inVal >> 16) & 0xff;
        int g = (inVal >> 8) & 0xff;
        int b = inVal & 0xff;

        rgbIm[pixel_count*3] = (byte)(r);
        rgbIm[pixel_count*3 + 1] = (byte)(g);
        rgbIm[pixel_count*3 + 2] = (byte)(b);

        pixel_count++;
    }

    return rgbIm;
}

public static Bitmap byte2ARGB(byte[] data, int width, int height)
{

    int pixelsCount = data.length / 3;
    int[] pixels = new int[pixelsCount];
    for (int i = 0; i < pixelsCount; i++)
    {
        int offset = 3 * i;
        int r = data[offset];
        int g = data[offset + 1];
        int b = data[offset + 2];
        pixels[i] = Color.rgb(r, g, b);
    }

    return Bitmap.createBitmap(pixels, width, height, Bitmap.Config.ARGB_8888);
}

Поэтому я попытался протестировать эти функции, просто загрузив изображение из папки ресурсов, преобразовав его в байтовый массив, немедленно преобразовав его обратно в Bitmp и сохранив его во внутреннем хранилище, чтобы проверить, будет ли окончательный результат соответствует исходному изображению. К сожалению, это не так, цветовое пространство кажется неправильным.

Например, если я загружаю этот png: original

и запускаю следующий код:

// Loads the png from assets folder
AssetManager am = getInstrumentation().getContext().getAssets();
InputStream is = am.open(filename);
Bitmap bitmap = BitmapFactory.decodeStream(is);

// Conversion to byte array
byte[] barray = ARGB2byte(bitmap);
Bitmap reconverted = Utils.byte2ARGB(barray, bitmap.getWidth(), bitmap.getHeight());

// Saving the reconverted Bitmap
try {
        String folder_path = context.getFilesDir().getAbsolutePath() + "/";
        File file = new File(folder_path + "test_conversion.png");
        FileOutputStream fos = new FileOutputStream(file);
        reconverted.compress(Bitmap.CompressFormat.PNG, 100, fos);
        fos.close();
    } catch (FileNotFoundException e) {
        Log.d("saving bitmap", "File not found: " + e.getMessage());
    } catch (IOException e) {
        Log.d("saving bitmap", "Error accessing file: " + e.getMessage());
    }
 }

Я получаю это в результате:

reconverted

Что я делаю не так? Если я использую тот же код для сохранения исходного растрового изображения сразу после его загрузки, полученное изображение будет правильным, поэтому я, вероятно, допускаю некоторую ошибку во время преобразования.

Я также проверял R, G, Значения B байтового массива исходного изображения сравнивают их со значениями байтового массива, полученного из реконвертированного изображения, и они одинаковы! Есть ли что-то, что библиотека Bitmap Android делает под капотом, может быть, с альфа-каналом? Я не могу понять это.

Спасибо

...