Редактирование растровых каналов Android

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

Как можно рекомбинировать несколько изображений в оттенках серого в качестве каналов в растровое изображение с помощью Android?


person Kleptine    schedule 30.12.2010    source источник


Ответы (3)


Вполне возможно снова объединить отдельные каналы в изображение 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 text alt textальтернативный текст

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


альтернативный текст


Небольшое примечание: красный овал — это непрозрачный красный овал на прозрачном фоне. Цвет здесь не имеет значения, но имеет значение альфа-канал

person Kevin Dion    schedule 08.01.2011
comment
Ах! Это именно то, что мне нужно. Немного сложно, но похоже работает. - person Kleptine; 10.01.2011

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

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

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

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

person Endian Ogino    schedule 04.01.2011
comment
Не совсем. У меня есть растровое изображение в полностью редактируемом состоянии. Я могу применять фильтры, преобразования и тому подобное. Чего я не могу понять, так это как редактировать отдельные каналы, а не все изображение сразу. - person Kleptine; 05.01.2011

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

    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));

person Phyrum Tea    schedule 07.01.2011
comment
или используйте буфер и читайте/записывайте цвет прямо из/в него bitmap.copyPixelsToBuffer(Buffer dst) - person Phyrum Tea; 07.01.2011
comment
Это, безусловно, сработает для простых манипуляций, но доступ к пикселям слишком медленный, так как мне нужно, чтобы это было сделано в реальном времени. - person Kleptine; 07.01.2011
comment
Я вижу, вы хотите использовать изображение в оттенках серого в качестве альфа-канала для другого изображения. Я не вижу готового метода. Возможно, вам придется получить доступ к буферу напрямую и сделать это на битовом уровне самостоятельно. - person Phyrum Tea; 07.01.2011
comment
Посмотрели в исходниках Android? Это может быть метод с аппаратным ускорением. - person Phyrum Tea; 07.01.2011