Изменение Альфы бита 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 2

1 ответ:

Проблема заключается в коде для получения Альфы. Во второй операции сдвига битов вы не учитываете бит знака.

int val=(ialpha.getRGB(0, 0) & 0xff000000) >> 24;

Это даст значение 0xffffff8c (учитывая ваш начальный Альфа 140 из 0x8c). Более подробно смотритепобитовые и битовые операторы сдвига . В частности:

Беззнаковый оператор сдвига вправо "> > > "сдвигает ноль в крайнее левое положение, в то время как крайнее левое положение после "> > " зависит от знака расширение.

Вам нужно либо сделать либо:

int val = (ialpha.getRGB(0, 0) & 0xff000000) >>> 24; // shift zero into left

Или:

int val = ialpha.getRGB(0, 0) >> 24) & 0xff; // mask out the sign part
PS: Я предпочитаю последнее, потому что большинство людей (включая меня) никогда не помнят, что на самом деле делает оператор >>>.. ;- )