Это старый вопрос, поэтому я отвечаю не ради ОП, а для таких, как я, которые найдут этот вопрос позже.
AlphaComposite
Как уже упоминалось в превосходном наброске @ Michael, операция AlphaComposite может изменить альфа-канал. Но только определенными способами, которые мне несколько сложны для понимания:
- это формула для того, как операция «over» влияет на альфа-канал. Более того, это также влияет на каналы RGB, поэтому, если у вас есть данные о цвете, которые необходимо изменить, AlphaComposite не является ответом.
BufferedImageOps
LookupOp
Существует несколько разновидностей BufferedImageOp (см. 4.10.6 здесь ). В более общем случае задача OP может быть выполнена с помощью LookupOp , который требует построения массивов поиска. Чтобы изменить только альфа-канал, укажите массив идентификаторов (массив где table [i] = i) для каналов RGB и отдельный массив для альфа-канала. Заполните последний массив table[i] = f(i)
, где f()
- это функция, с помощью которой вы хотите отобразить старое альфа-значение на новое. Например. если вы хотите, чтобы «каждый пиксель в изображении, имеющий альфа-значение 100, имело альфа-значение 80», установите table[100] = 80
. (Полный диапазон от 0 до 255.) См. , как увеличить непрозрачность при размытии по Гауссу для примера кода.
RescaleOp
Но для подмножества этих случаев есть более простой способ сделать это, не требующий настройки таблицы поиска. Если f()
- простая линейная функция, используйте RescaleOp . Например, если вы хотите установить newAlpha = oldAlpha - 20
, используйте RescaleOp с scaleFactor, равным 1, и смещением -20. Если вы хотите установить newAlpha = oldAlpha * 0.8
, используйте scaleFactor, равный 0,8, и смещение, равное 0. В любом случае вам снова нужно предоставить фиктивные scaleFactor и смещения для каналов RGB:
new RescaleOp({1.0f, 1.0f, 1.0f, /* alpha scaleFactor */ 0.8f},
{0f, 0f, 0f, /* alpha offset */ -20f}, null)
Снова см. 4.10.6 здесь для некоторых примеров, которые хорошо иллюстрируют принципы, но не относятся к альфа-каналу.
Обе RescaleOp и LookupOp позволяют изменять BufferedImage на месте.