Вполне возможно снова объединить отдельные каналы в изображение 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 изображениями (красное, зеленое, синее и альфа-канал соответственно):
Получаем следующий результат:
Небольшое примечание: красный овал — это непрозрачный красный овал на прозрачном фоне. Цвет здесь не имеет значения, но имеет значение альфа-канал
person
Kevin Dion
schedule
08.01.2011