#java #rgb #bufferedimage #alpha-transparency
#java #rgb #буферное изображение #альфа-прозрачность
Вопрос:
Если мы возьмем, скажем, 32-битные изображения на пиксель, используя ARGB и ARGB_PRE (ARGB, но с предварительно умноженной альфой), будут ли значения идентичны, когда альфа полностью включена (то есть: вообще нет прозрачности)?
Например, если у меня есть пиксель ARGB со следующим значением: 0xFF808080 (который имеет оттенок серого, без какой-либо прозрачности, потому что альфа имеет максимальное значение: 255), во что это превратится в ARGB_PRE?
Как я могу выяснить это самостоятельно? Достаточно ли создать экземпляр одного буферизованного изображения с использованием ARGB, а другого ARGB_PRE и использовать setRGB(…) для обоих, а затем сравнить int, который я получу обратно?
Например, если я сделаю это:
final BufferedImage bi1 = new BufferedImage(10,10,BufferedImage.TYPE_INT_ARGB);
final BufferedImage bi2 = new BufferedImage(10,10,BufferedImage.TYPE_INT_ARGB_PRE);
bi1.setRGB(0,0,0xFF808080);
bi2.setRGB(0,0,0xFF808080);
System.out.println("bi1: " Integer.toHexString(bi1.getRGB(0, 0)));
System.out.println("bi2: " Integer.toHexString(bi2.getRGB(0, 0)));
Я получаю одинаковое значение для обоих, но это нормально, что это то самое значение, которое я дал.
В основном мой вопрос сводится к следующему: если в изображениях нет ни одного прозрачного пикселя, могу ли я генерировать точно такие же изображения, используя одинаковые значения как в режимах ARGB, так и в режимах ARGB_PRE?
Или сформулировано так: если у меня нет прозрачного пикселя, ARGB и ARGB_PRE в основном идентичны?
Ответ №1:
Предварительно умноженная альфа означает, что цвета, сохраненные в данных изображения, умножаются на альфа, поэтому их не нужно умножать при составлении (рисовании). это меняет не то, как выглядит изображение при рисовании, а то, как хранятся его данные…
Кстати, если ваше изображение имеет только альфа-значения 255 (255 при составлении означает 1.0f), то результирующий цвет всегда будет равен 1 * color = color (не изменен)
Ответ №2:
ДА. Ваше понимание правильное.
Комментарии:
1. хорошо, спасибо… Я принял ответ нового пользователя, потому что он новичок 🙂