gpt4 book ai didi

Java缓冲图像: Alpha change makes low alpha areas appear black

转载 作者:行者123 更新时间:2023-11-30 07:53:47 25 4
gpt4 key购买 nike

我有一个方法可以改变 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)。可能无法恢复原来的颜色。

关于Java缓冲图像: Alpha change makes low alpha areas appear black,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32973969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com