Изменение Альфы бита rgb
Я устанавливаю Альфа rgb buffredimage в java. Этот код изменяет Альфа-значение, но я не могу получить то же значение после сохранения файла. Как преодолеть эту проблему.
// ================ Code for setting alpha ===============
int alpha=140;
// alpha value to set in rgb
int b=alpha<<24;
b=b|0x00ffffff;
ialpha.setRGB(0, 0,ialpha.getRGB(0, 0)&b);
// ialpha is a bufferedimage of type TYPE_INT_ARGB
ImageIO.write(ialpha, "png", new File("C:/newimg.png"));
System.out.println("nFile saved !");
// ================ Code for getting alpha ===============
int val=(ialpha.getRGB(0, 0)&0xff000000)>>24;
if(val<0)
val=256+val;
System.out.println("Returned alpha value:"+val);
Это просто возвращает 255 в качестве альфа-значения. он не возвращает значение i set, т. е. 140.
Пожалуйста, помогите мне восстановить значение альфа, которое я ранее установил.
1 ответ:
Проблема заключается в коде для получения Альфы. Во второй операции сдвига битов вы не учитываете бит знака.
int val=(ialpha.getRGB(0, 0) & 0xff000000) >> 24;
Это даст значение
0xffffff8c
(учитывая ваш начальный Альфа140
из0x8c
). Более подробно смотритепобитовые и битовые операторы сдвига . В частности:Беззнаковый оператор сдвига вправо "> > > "сдвигает ноль в крайнее левое положение, в то время как крайнее левое положение после "> > " зависит от знака расширение.Вам нужно либо сделать либо:
int val = (ialpha.getRGB(0, 0) & 0xff000000) >>> 24; // shift zero into left
Или:
PS: Я предпочитаю последнее, потому что большинство людей (включая меня) никогда не помнят, что на самом деле делает операторint val = ialpha.getRGB(0, 0) >> 24) & 0xff; // mask out the sign part
>>>
.. ;- )