Java BuffereImage:Alpha更改使低Alpha区域显示为黑色

Java BuffereImage:Alpha更改使低Alpha区域显示为黑色,java,colors,png,bufferedimage,alpha,Java,Colors,Png,Bufferedimage,Alpha,我有一个在Java中更改BuffereImage的alpha值的方法。这是我的代码: public static void setAlpha(BufferedImage img, byte alpha) { alpha %= 0xff; for (int cx=0;cx<img.getWidth();cx++) { for (int cy=0;cy<img.getHeight();cy++) { int color = img.

我有一个在Java中更改BuffereImage的alpha值的方法。这是我的代码:

public static void setAlpha(BufferedImage img, byte alpha) {
    alpha %= 0xff;
    for (int cx=0;cx<img.getWidth();cx++) {
        for (int cy=0;cy<img.getHeight();cy++) {
            int color = img.getRGB(cx, cy);
            color &= 0x00ffffff;
            color |= (alpha << 24);
            img.setRGB(cx, cy, color);
        }
    }
}
publicstaticvoidsetalpha(BufferedImage-img,字节alpha){
alpha%=0xff;
对于(intcx=0;cx语句

alpha %= 0xff;
似乎有点奇怪。由于Java
字节
是有符号的(并且在[-128…127]范围内),这将永远不会更改
alpha
(对于字节范围内的任何值,x%255=x)

但是,您希望alpha在[0…255]范围内。通常,您可以使用
&
运算符来执行此操作。但仅更改运算符是不行的,因为您将值存储在
字节中,这将再次强制值进入范围[-128…127]

相反,请尝试(在循环中):


color |=((alpha&0xff)…胡乱猜测:因为
set**RGB**
只设置红色、绿色和蓝色?@jongw可能是不好的命名,但不是。所有
get/setRGB
方法都使用sRGB颜色空间中的32位ARGB值。您的
BufferedImage
是什么类型的?
alpha%=0xff
中的模数是您实际想要使用的吗(因此,
257
的输入值将存储为
2
),或者您是否将其与
max(alpha,255)
之类的内容混淆?
alpha %= 0xff;
color |= ((alpha & 0xff) << 24);
int alphaValue = alpha & 0xff;
for (...) {
    for (...) {
        // Inside the loop:
        color |= (alphaValue << 24);
    }
}