改变rgb位的alpha

时间:2013-04-05 10:47:16

标签: java image bufferedimage alpha rgba

我在java中设置了rgb的buffredimage的alpha。 此代码更改了alpha值,但保存文件后我无法检索相同的值。 如何克服这个问题。

// ================ 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作为alpha值。它没有返回我设定的值,即140。

请帮我检索我之前设定的alpha值。

1 个答案:

答案 0 :(得分:2)

问题在于获取alpha的代码。在第二个位移操作中,不要考虑符号位。

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

这将给出值0xffffff8c(给定140 0x8c的初始alpha值。 有关详细信息,请参阅Bitwise and Bit Shift Operators。特别是:

  

无符号右移运算符“&gt;&gt;&gt;”将零移动到最左边的位置,而在“&gt;&gt;”之后的最左边的位置移动取决于符号扩展。

你需要做任何一个:

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:我倾向于选择后者,因为大多数人(包括我自己)都不记得>>>运算符实际上做了什么..; - )