Java BufferedImage:Alpha 变化使低 alpha 区域显示为黑色
Java BufferedImage: Alpha change makes low alpha areas appear black
我有一种方法可以更改 Java 中 BufferedImage 的 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);
}
}
}
当我使用这个功能时,图像中所有之前透明的区域都变黑了。为什么?
编辑:
非常感谢您的帮助。现在我想通了,问题是什么。这是我的工作职能:
public static void changeAlpha(BufferedImage img, float alphaPercent) {
for (int cx=0;cx<img.getWidth();cx++) {
for (int cy=0;cy<img.getHeight();cy++) {
int color = img.getRGB(cx, cy);
byte alpha = (byte) (color >> 24);
alpha = (byte) ((float) (int) (alpha & 0xff) * alphaPercent);
color &= 0x00ffffff;
color |= ((alpha & 0xff) << 24);
img.setRGB(cx, cy, color);
}
}
}
声明
alpha %= 0xff;
好像有点奇怪。由于 Java byte
已签名(并且在 [-128...127] 范围内),这将永远不会改变 alpha
(x % 255 = x 对于字节范围内的任何值) .
但是,您希望 alpha 在 [0...255] 范围内。通常,您使用 &
运算符执行此操作。但是仅更改运算符是不行的,因为您将值存储在 byte
中,这将强制值再次进入 [-128...127] 范围...
相反,尝试(在你的循环内):
color |= ((alpha & 0xff) << 24);
或者,您可以这样写:
int alphaValue = alpha & 0xff;
for (...) {
for (...) {
// Inside the loop:
color |= (alphaValue << 24);
}
}
最后,关于透明度的说明。如果您的像素以前是 100% 透明的,则该像素的颜色无关紧要。出于这个原因,为了提高效率,它可能被标准化为黑色(所有 0
s)。可能无法恢复原来的颜色。
我有一种方法可以更改 Java 中 BufferedImage 的 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);
}
}
}
当我使用这个功能时,图像中所有之前透明的区域都变黑了。为什么?
编辑:
非常感谢您的帮助。现在我想通了,问题是什么。这是我的工作职能:
public static void changeAlpha(BufferedImage img, float alphaPercent) {
for (int cx=0;cx<img.getWidth();cx++) {
for (int cy=0;cy<img.getHeight();cy++) {
int color = img.getRGB(cx, cy);
byte alpha = (byte) (color >> 24);
alpha = (byte) ((float) (int) (alpha & 0xff) * alphaPercent);
color &= 0x00ffffff;
color |= ((alpha & 0xff) << 24);
img.setRGB(cx, cy, color);
}
}
}
声明
alpha %= 0xff;
好像有点奇怪。由于 Java byte
已签名(并且在 [-128...127] 范围内),这将永远不会改变 alpha
(x % 255 = x 对于字节范围内的任何值) .
但是,您希望 alpha 在 [0...255] 范围内。通常,您使用 &
运算符执行此操作。但是仅更改运算符是不行的,因为您将值存储在 byte
中,这将强制值再次进入 [-128...127] 范围...
相反,尝试(在你的循环内):
color |= ((alpha & 0xff) << 24);
或者,您可以这样写:
int alphaValue = alpha & 0xff;
for (...) {
for (...) {
// Inside the loop:
color |= (alphaValue << 24);
}
}
最后,关于透明度的说明。如果您的像素以前是 100% 透明的,则该像素的颜色无关紧要。出于这个原因,为了提高效率,它可能被标准化为黑色(所有 0
s)。可能无法恢复原来的颜色。