Android растровое манипулирование - PullRequest
1 голос
/ 10 ноября 2011

Можете ли вы сказать мне, что не так с этим фрагментом кода?

//bmp is a bitmap of already present image
int width=bmp.getWidth();
int height=bmp.getHeight();
int rgbval[]=new int[width*height];
bmp.getPixels(rgbval, 0, width, 0, 0, width, height);
rgbval=actual(rgbval);
Bitmap bmp2=bmp.copy(Bitmap.Config.ARGB_8888,true);
bmp2.setPixels(rgbval, 0, width, 0, 0, width, height);

actual - это функция, которую я создал, чтобы манипулировать значениями rgb bmp. Используя отладочные функции eclipse, я проверил, что он работает правильно, но когда я пытаюсь восстановить значения rgb для bmp2, я не получаю манипулируемые значения.

Ответы [ 2 ]

2 голосов
/ 10 ноября 2011

Прежде всего, посмотрите этот ответ: Набор растровых изображений 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
1 голос
/ 08 апреля 2012

Я думаю, что проблема связана с некоторой ошибкой Android. Я манипулировал пикселями растрового изображения, и мне нужно, чтобы значения пикселей были точно такими же, но когда я использовал setPixels для установки полных пикселей растрового изображения, это не сработало. Я нашел решение с помощью

index=0;
for (int j = 0; j < height; j++)
   for (int i = 0; i < width; i++)
   {
    destBitmap.setPixel(i, j, pixelvalues[index]);

   }

Так что, если я устанавливаю пиксель один за другим, а не все за раз, это работает!

...