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 はアルファをサポートしていませんでした。読み取り後の迅速な変換により、残りのコードがスムーズに実行されます。

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

これは現在反対票を投じられているため、これが関連するかどうかはわかりませんが、問題は、元の BufferedImage が ImageIO によって読み込まれており、この画像が ARGB をサポートしていなかったことです。読み取り後の迅速な変換により、残りのコードが機能するようになりました。

于 2012-12-12T02:19:41.427 に答える