Операции с битовой маской изображения с буферизацией - примените цвет к изображению, используя другое изображение в качестве маски - PullRequest
1 голос
/ 22 сентября 2011

У меня есть два объекта BufferedImage, src и dest.Оба имеют оттенки серого, src равен 1 бит / с (в основном черно-белое изображение), и dest действительно может быть любым цветовым пространством / бит / кадр / и т. Д.используя src в качестве битовой маски.По сути, если пиксель в src черный, то dest следует изменить на цвет рисования.Но если пиксель в src является белым, dest следует оставить в одиночестве.

Если это имеет значение, я также применяю аффинное преобразование во время операции рисования.* В чистом черно-белом мире это будет включать просто | значений пикселей вместе - но, похоже, есть правильный способ сделать это, используя операции с изображениями.

Инстинкт Гут говорит, что это вопроснастройки Composite и некоторого альфа-канала - но я в полной растерянности относительно того, какие значения использовать.У меня очень мало опыта работы с более продвинутыми аспектами графики 2d - любые указатели будут с благодарностью.

1 Ответ

0 голосов
/ 24 сентября 2011

Я думаю, что нашел эффективное решение, используя эту статью

Это, безусловно, эффективно, хотя я не уверен, следует ли передовой опыт или нет:

BufferedImage dest; // input
BufferedImage src; // input

...

byte[] r = new byte[]{(byte)0,(byte)255}; // 255=black, we could set it to some other gray component as desired
byte[] g = new byte[]{(byte)0,(byte)255};
byte[] b = new byte[]{(byte)0,(byte)255};
byte[] a = new byte[]{(byte)255,(byte)0};
IndexColorModel bitmaskColorModel = new IndexColorModel(1, 2, r, g, b, a);

BufferedImage masked = new BufferedImage(bitmaskColorModel, src.getRaster(), false, null);

Graphics2D g = dest.createGraphics();
g.drawImage(masked, transform, null);
g.dispose();
...