0

我正在尝试更改像素的 alpha 值以使图像半透明。这是我的代码:

for(int x=0;x<image1.getWidth();x++) {
    for(int y=0;y<image1.getHeight();y++) {
        int rgb = image1.getRGB(x, y);

        rgb = rgb | 0x000000ff; // make the image blue.
        rgb = rgb & 0x33ffffff; // make the image transparent.
        System.out.println("before: " + Integer.toHexString(rgb));

        image1.setRGB(x, y, rgb);
        int now_rgb= image1.getRGB(x, y);
        System.out.println("after: " + Integer.toHexString(now_rgb));
    }
}

输出是这样的:

before: 331b1aff
after: ff1b1aff
before: 331918ff
after: ff1918ff
before: 331e1bff
after: ff1e1bff
before: 332623ff
after: ff2623ff
before: 332e29ff
after: ff2e29ff

如您所见,setRGB 似乎省略了 alpha 值并将其设置为“ff”。我该如何解决这个问题,为什么会首先发生?

4

2 回答 2

2

这可能是因为您BufferedImage的颜色模型不支持 alpha 或者可能只使用一个位作为 alpha。

你从哪里来image的?它的颜色模型也是 ARGB 吗?使用image.getColorModel().hasAlpha()来检查。如果没有,请确保在创建图像时它具有适当的颜色模型,如果无法更改,请使用所需的颜色模型创建新图像并首先复制源图像。

于 2013-04-23T04:24:36.720 回答
2

使用AlphaComposite

BufferedImage img = //some code here
BufferedImage imgClone = //some clone of img, but let its type be BufferedImage.TYPE_INT_ARGB
Graphics2D imgCloneG = imgClone.createGraphics();
imgCloneG.setComposite(AlphaComposite.getInstance(AlphaComposite.DST_IN, 0.5f));
imgCloneG.drawImage(img, 0, 0, null);
//imgClone is now img at half alpha

imgClone可以这样制作:

...
imgClone = new BufferedImage(img.getWidth(), img.getHeight(), 
                             BufferedImage.TYPE_INT_ARGB);
Graphics2D imgCloneG = imgClone.createGraphics();
imgCloneG.drawImage(img, 0, 0, null);
imgCloneG.setComposite(AlphaComposite.getInstance(AlphaComposite.DST_IN, 0.5f));
...
于 2013-04-23T04:33:59.023 回答