Android Редактировать растровые каналы - PullRequest
14 голосов
/ 30 декабря 2010

Возможно получить доступ к альфа-каналу данного растрового изображения с помощью extractAlpha(), но я не смог найти способа фактически установить альфа-канал растрового изображения.

Как можно объединить несколько изображений в градациях серого в виде каналов в растровое изображение с Android?

Ответы [ 3 ]

23 голосов
/ 08 января 2011

Вполне возможно объединить отдельные каналы обратно в изображение ARGB. Вам просто нужны изображения каналов в градациях серого и изображение с нужным альфа-каналом - обратите внимание, что это не непрозрачное изображение в градациях серого, а изображение с альфа , которое вы хотите. Затем вы рисуете каждый канал с Paint, используя соответствующий PorterDuffXfermode, на пустом, черном заполненном растровом изображении.

// have your 3 channel grayscales and 1 alpha bitmap loaded by this point

Paint redPaint = new Paint();
redPaint.setXfermode(new PorterDuffXfermode(Mode.LIGHTEN));
redPaint.setShader(new BitmapShader(redChanImg, TileMode.CLAMP, TileMode.CLAMP));
redPaint.setColorFilter(new PorterDuffColorFilter(Color.RED, Mode.DARKEN));

Paint greenPaint = new Paint();
greenPaint.setXfermode(new PorterDuffXfermode(Mode.LIGHTEN));
greenPaint.setShader(new BitmapShader(greenChanImg, TileMode.CLAMP, TileMode.CLAMP));
greenPaint.setColorFilter(new PorterDuffColorFilter(Color.GREEN, Mode.DARKEN));

Paint bluePaint = new Paint();
bluePaint.setXfermode(new PorterDuffXfermode(Mode.LIGHTEN));
bluePaint.setShader(new BitmapShader(blueChanImg, TileMode.CLAMP, TileMode.CLAMP));
bluePaint.setColorFilter(new PorterDuffColorFilter(Color.BLUE, Mode.DARKEN));

Paint alphaPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
alphaPaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));

c.setBitmap(resultImage);
c.drawRect(0, 0, width, height, redPaint);
c.drawRect(0, 0, width, height, greenPaint);
c.drawRect(0, 0, width, height, bluePaint);
c.drawBitmap(alphaImg, 0, 0, alphaPaint);

//save off resultImage, display it, etc...

С вышеуказанным кодом и следующими 4 изображениями (красный, зеленый, синий и альфа соответственно): alt textalt textalt textalt text

Получаем следующий результат:


alt text


Просто небольшое замечание: красный овал - непрозрачный, красный овал на прозрачном фоне - цвет не имеет значения для этого, но альфа имеет значение

0 голосов
/ 07 января 2011

Вы пробовали с холстом? Следующее выглядит как взломать, но, возможно, это будет работать. Я не проверял это сам.

<code>    Bitmap bitmap;
    int color = bitmap.getPixel(1, 123);
    Rect rect = new Rect(1,123,2,124);
    Canvas c = new Canvas(bitmap);
    c.clipRect(rect);
    c.drawARGB(50, Color.red(color), Color.green(color), Color.blue(color));
0 голосов
/ 04 января 2011

Манипулирование растровыми изображениями - это очень простая вещь, когда требуется прямой доступ к пикселю (байту).Чтобы сделать это в Android, вы можете сделать это через этот подход

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos); 
byte[] b = bos.toByteArray();  

Теперь вы можете делать любые манипуляции с изображениями, преобразования или комбинации, которые вам нравятся.

Я надеюсь, что это то, что вы искали.

...