Java BuffereImage:Alpha更改使低Alpha区域显示为黑色
我有一个在Java中更改BuffereImage的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.
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);
}
}