Объединение нескольких изображений в одно изображение для последующего рисования с альфа-смешиванием

У меня есть графическая система для Java, которая позволяет «оклеивать» объекты обоями, указывая несколько изображений, которые могут иметь (относительно) сложные параметры выравнивания и изменения размера.

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

Решение работает очень хорошо, за исключением того, что когда у меня есть PNG-изображения с прозрачностью альфа-канала, альфа-канал теряется при рисовании композита, то есть в композите все пиксели полностью непрозрачны. Таким образом, последующее копирование в контекст экранной графики не позволяет увидеть то, что находится за оклеенным обоями объектом.

Мне удалось использовать RGBImageFilter для фильтрации полностью прозрачных пикселей, но я не вижу в этом решения, чтобы заставить работать смешанную прозрачность.

Кто-нибудь знает, как я могу раскрасить изображения с неповрежденным альфа-каналом и объединить их, если два пикселя с альфа-значениями перекрываются?


person Lawrence Dol    schedule 03.08.2009    source источник


Ответы (1)


Какой тип изображения вы используете для составного изображения?

Вы должны использовать BufferedImage и установить его тип на TYPE_INT_ARGB, что обеспечивает прозрачность.

person Savvas Dalkitsis    schedule 03.08.2009
comment
Я только что использую java.awt.component.createImage (). Рассмотрим использование BufferedImage и расскажем, как это происходит. - person Lawrence Dol; 03.08.2009
comment
Это работает, большое спасибо. Как я пропустил BufferedImage, не знаю! - person Lawrence Dol; 03.08.2009
comment
На мой взгляд, BufferedImage - единственный наиболее полезный подкласс изображений Java. Вы всегда должны использовать это, когда можете. Если это изображение будет использоваться довольно часто, вам следует включить для него аппаратное ускорение, вызвав BufferedImage (). SetAcceleration () с параметром больше 0. Подробности читайте в API. - person Savvas Dalkitsis; 04.08.2009