【问题标题】:Java BufferedImage: Alpha change makes low alpha areas appear blackJava BufferedImage:Alpha 更改使低 Alpha 区域显示为黑色
【发布时间】:2016-01-03 14:34:10
【问题描述】:

我有一种方法可以在 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);
        }
    }
}

【问题讨论】:

  • ...一个疯狂的猜测:因为set**RGB** 只设置红色、绿色和蓝色?
  • @Jongware 命名错误,也许,但不是。所有get/setRGB 方法都适用于 sRGB 颜色空间中的 32 位 ARGB 值。
  • 你的BufferedImage是什么类型的?
  • alpha %= 0xff 中的 modulus 是您实际要使用的(因此257 的输入值将存储为2),或者您是将其与 max(alpha, 255) 之类的东西混淆?

标签: java colors png bufferedimage alpha


【解决方案1】:

声明

alpha %= 0xff;

似乎有点奇怪。由于 Java byte 已签名(并且在 [-128...127] 范围内),这将永远不会更改 alpha(对于字节范围内的任何值,x % 255 = x)。

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

相反,尝试(在您的循环内):

color |= ((alpha & 0xff) << 24);

或者,您可以编写如下内容:

int alphaValue = alpha & 0xff;
for (...) {
    for (...) {
        // Inside the loop:
        color |= (alphaValue << 24);
    }
}

最后,关于透明度的说明。如果您的像素以前是 100% 透明的,则该像素中的颜色无关紧要。出于这个原因,为了提高效率,它可能会被标准化为黑色(全部为0s)。可能无法恢复原来的颜色。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多