2

Java で特定の形状の画像をカットしたい。たとえば、白い背景を持つ男性を含む画像。ここでは、背景のない男性をトリミングしたい。透過画像にしたくない、座標でカットしたい。cropImageFilter を使用すると、長方形の領域のみを切り取ることができると思います。誰でもこれを行う方法を教えてもらえますか?

4

2 に答える 2

0

まず、java.awt.Imageからjava.awt.image.BufferedImageを作成する必要があります。これを行うためのコードをDZoneSnippetsからいくつか示します。

/**
 * @author Anthony Eden
 */
public class BufferedImageBuilder {

    private static final int DEFAULT_IMAGE_TYPE = BufferedImage.TYPE_INT_RGB;

    public BufferedImage bufferImage(Image image) {
        return bufferImage(image, DEFAULT_IMAGE_TYPE);
    }

    public BufferedImage bufferImage(Image image, int type) {
        BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), type);
        Graphics2D g = bufferedImage.createGraphics();
        g.drawImage(image, null, null);
        waitForImage(bufferedImage);
        return bufferedImage;
    }

    private void waitForImage(BufferedImage bufferedImage) {
        final ImageLoadStatus imageLoadStatus = new ImageLoadStatus();
        bufferedImage.getHeight(new ImageObserver() {
            public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) {
                if (infoflags == ALLBITS) {
                    imageLoadStatus.heightDone = true;
                    return true;
                }
                return false;
            }
        });
        bufferedImage.getWidth(new ImageObserver() {
            public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) {
                if (infoflags == ALLBITS) {
                    imageLoadStatus.widthDone = true;
                    return true;
                }
                return false;
            }
        });
        while (!imageLoadStatus.widthDone && !imageLoadStatus.heightDone) {
            try {
                Thread.sleep(300);
            } catch (InterruptedException e) {

            }
        }
    }

    class ImageLoadStatus {

        public boolean widthDone = false;
        public boolean heightDone = false;
    }

}

BufferedImageができたので、座標のポリゴンを使用して、人間ではないピクセルを透明にする必要があります。BufferedImageで提供されているメソッドを使用するだけです。

BufferedImageから文字通りポリゴンを切り取ることができません。BufferedImageは長方形である必要があります。あなたができる最善のことは、あなたが透明にしたくない画像の部分を作ることです。または、必要なピクセルを別の長方形のBufferedImageに配置することもできます。

于 2010-06-23T08:42:30.150 に答える
0

よくわかりませんが、クラスGraphics2Dにはポリゴンを受け入れるメソッドclip()があり、必要なことはできると思います。

したがって、画像から BufferedImage を作成し、 Graphics2D オブジェクトを取得しますcreateGraphics()

于 2010-06-23T09:52:19.663 に答える