【问题标题】:Changing alpha of rgb bit更改 rgb 位的 alpha
【发布时间】:2013-04-05 10:47:15
【问题描述】:

我在 java 中设置 buffredimage 的 rgb 的 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 值。

【问题讨论】:

  • 为什么要使用位运算?? java有一些漂亮的功能来设置rgb创建新颜色等等。
  • this 的可能重复项。你可以在这里找到你要找的东西。

标签: java image bufferedimage alpha rgba


【解决方案1】:

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

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

这将给出0xffffff8c 的值(给定1400x8c 的初始alpha)。 有关更多详细信息,请参阅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:我倾向于后者,因为大多数人(包括我自己)都不记得 &gt;&gt;&gt; 操作符实际上做了什么.. ;-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-07
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    相关资源
    最近更新 更多