2013-04-05 54 views
2

我在设置buffredimage的rgb的alpha。 此代码更改alpha值,但保存文件后无法检索相同的值。 如何解决这个问题。更改rgb位的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值。

+0

为什么你使用位操作? java有一些漂亮的功能,可以设置rgb创建新的颜色等等。 – 2013-04-05 10:54:57

+0

[this]的可能重复(http://stackoverflow.com/questions/6734171/set-rgb-and-alpha-component-value-of-a-color?rq = 1)。你可能会发现你在这里寻找什么。 – Maximin 2013-04-05 11:23:36

回答

1

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

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

这将给值0xffffff8c(给你的0x8c140初始α)。 查看Bitwise and Bit Shift Operators了解更多详情。特别是:

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

您需要可以做两种:

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:我倾向于选择后者,因为大多数人(包括我自己)永远记住什么>>>操作员实际上是做的; ;-)