2

我想在java中剪切特定形状的图像,例如包含一个白色背景的人的图像,在这里我想裁剪没有背景的人。不想让它成为透明图像,想用一些坐标切割。我认为使用cropImageFilter 我们只能剪切矩形区域。谁能告诉我该怎么做?

4

2 回答 2

0

首先,您需要从 java.awt.Image 创建一个 java.awt.image.BufferedImage。这里有一些代码可以做到这一点,来自DZone Snippets

/**
 * @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 回答