Являются ли ARGB и ARGB_PRE одинаковыми, когда альфа заполнена?

#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. хорошо, спасибо… Я принял ответ нового пользователя, потому что он новичок 🙂