0

我知道这与合成有关,但我不知道是什么。在前面的代码部分中,将 BufferedImage 中的特定像素列表设置为透明黑色:

        for(Pixel p : closed){
            Color c = new Color(image.getRGB(p.x, p.y));
            Color newC = new Color(0,0,0, 0);
            image.setRGB(p.x, p.y, newC.getRGB() & 0x00000000);
        }

        if(andCrop){
            image = image.getSubimage(left, top, right-left, bottom-top);
        }


        return image;

然后我尝试写出图像:

try {

            BufferedImage out = new BufferedImage(image.getWidth(), image.getHeight(), java.awt.Transparency.TRANSLUCENT);
            Graphics2D g2d = out.createGraphics();
            g2d.setComposite(AlphaComposite.Clear);
            g2d.fillRect(0, 0, image.getWidth(), image.getHeight());
            g2d.setComposite(AlphaComposite.Src);
            g2d.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);
            g2d.dispose();

            File outputfile = new File(file);
            ImageIO.write(out, "png", outputfile);
        } catch (IOException e) {

        }

现在,在我尝试将图像绘制到上面之前,我知道“out”已经很清楚了。我没有得到的是我的合成出了什么问题。我不是透明的,而是全黑的。

使用的所有缓冲图像都是 INT_ARGB。

编辑 - 这已经解决了。图像源来自 ImageIO.read,返回的 BufferedImage 不支持 alpha。快速的读取后转换让其余代码顺利运行。

4

2 回答 2

1

我想到的事情......(感谢安德鲁):

java.awt.Transparency.TRANSLUCENT = 3
TYPE_INT_ARGB = 2
TYPE_INT_ARGB_PRE = 3

public BufferedImage(int width,
                 int height,
                 int imageType)

Constructs a BufferedImage of one of the predefined image types. (TYPE_...)

http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/image/BufferedImage.html

所以它似乎基本上是一个混淆。

另外,你想要达到的效果是什么?您清除一个空图像,然后为其绘制完全透明的像素……我只是不明白。

于 2012-12-12T02:07:48.093 回答
0

Whelp,这已经被否决了,所以我不确定这是否相关,但问题是ImageIO 正在读取原始 BufferedImage ,并且该图像不支持 ARGB。快速的读取后转换允许其余代码工作。

于 2012-12-12T02:19:41.427 回答