Прежде всего, посмотрите этот ответ: Набор растровых изображений AndroidПиксель не работает правильно?(установите значение, затем прочитайте другое значение)
Итак, кажется, что если ваше исходное изображение не имеет альфа-канала (т. е. hasAlpha () возвращает false), оно автоматически преобразует rgbзначения в предварительно умноженном формате.Это то, что вы испытываете?Является ли bmp.hasAlpha () ложным?
Я только что протестировал ваш код со значком Android по умолчанию в качестве растрового изображения, с которым hasAlpha () возвращает true.Альфа-каналы во входных и выходных цветовых массивах идентичны.Тем не менее, красные каналы отключены на один или два для 15 из 2304 пикселей.Я не проверял синие или зеленые каналы.Я полагаю, это внутренняя ошибка округления?Я публикую довольно многословный и используемый только для тестирования код, который я использовал на всякий случай, если кому-то есть что добавить.
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
int width=bmp.getWidth();
int height=bmp.getHeight();
int rgbval[]=new int[width*height];
bmp.getPixels(rgbval, 0, width, 0, 0, width, height);
int rgbval2[] = actual(rgbval);
Bitmap bmp2=bmp.copy(Bitmap.Config.ARGB_8888,true);
bmp2.setPixels(rgbval2, 0, width, 0, 0, width, height);
int rgb2[] = new int[width*height];
bmp2.getPixels(rgb2, 0, width, 0, 0, width, height);
int alpha1[] = new int[width*height];
int alpha2[] = new int[width*height];
int red1[] = new int[width*height];
int red2[] = new int[width*height];
for(int i=0; i<alpha2.length; ++i) {
alpha1[i] = Color.alpha(rgbval2[i]);
alpha2[i] = Color.alpha(rgb2[i]);
red1[i] = Color.red(rgbval2[i]);
red2[i] = Color.red(rgb2[i]);
if(red1[i]!=red2[i]) {
int a1 = alpha1[i];
int a2 = alpha2[i];
int r1 = red1[i];
int r2 = red2[i];
Log.e("E", String.format("a1: %d, a2: %d, r1: %d, r2: %d", a1, a2, r1, r2));
}
}
private int[] actual(int rgb[]) {
int rgb2[] = new int[rgb.length];
for(int i=0; i<rgb.length; ++i) {
rgb2[i] = Color.argb(Color.alpha(rgb[i]), Color.red(rgb[i])/2,
Color.green(rgb[i])/2, Color.blue(rgb[i])/2);
}
return rgb2;
}
и вот вывод LogCat
a1: 64, a2: 64, r1: 30, r2: 32
a1: 64, a2: 64, r1: 30, r2: 32
a1: 142, a2: 142, r1: 58, r2: 57
a1: 142, a2: 142, r1: 58, r2: 57
a1: 216, a2: 216, r1: 56, r2: 55
a1: 216, a2: 216, r1: 56, r2: 55
a1: 57, a2: 57, r1: 6, r2: 4
a1: 59, a2: 59, r1: 6, r2: 4
a1: 231, a2: 231, r1: 90, r2: 91
a1: 216, a2: 216, r1: 95, r2: 94
a1: 216, a2: 216, r1: 95, r2: 94
a1: 217, a2: 217, r1: 57, r2: 58
a1: 216, a2: 216, r1: 88, r2: 89
a1: 199, a2: 199, r1: 66, r2: 67
a1: 199, a2: 199, r1: 39, r2: 38