В 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:
и запускаю следующий код:
// 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());
}
}
Я получаю это в результате:
Что я делаю не так? Если я использую тот же код для сохранения исходного растрового изображения сразу после его загрузки, полученное изображение будет правильным, поэтому я, вероятно, допускаю некоторую ошибку во время преобразования.
Я также проверял R, G, Значения B байтового массива исходного изображения сравнивают их со значениями байтового массива, полученного из реконвертированного изображения, и они одинаковы! Есть ли что-то, что библиотека Bitmap Android делает под капотом, может быть, с альфа-каналом? Я не могу понять это.
Спасибо