java中的图像裁剪

java中的图像裁剪,java,image,crop,Java,Image,Crop,我想在java中剪切一个特定形状的图像,例如一个包含有白色背景的人的图像,这里我想裁剪没有背景的人。不想让它成为透明的图像,想用一些坐标剪切。我认为使用cropImageFilter我们只能切割矩形区域。有人能告诉我怎么做吗 首先,需要从java.awt.image创建java.awt.image.buffereImage。这里有一些代码可以做到这一点,从 现在你有了一个BuffereImage,你可以使用坐标的多边形,你必须把不是人的像素变成透明的。只需使用BuffereImage中提供的方法

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

首先,需要从java.awt.image创建java.awt.image.buffereImage。这里有一些代码可以做到这一点,从

现在你有了一个BuffereImage,你可以使用坐标的多边形,你必须把不是人的像素变成透明的。只需使用BuffereImage中提供的方法


你不能直接从BuffereImage中剪切多边形。BuffereImage必须是矩形。你能做的最好的事情就是把你不想要的部分变成透明的。或者,您可以将所需的像素放在另一个矩形BuffereImage上。

首先,您需要从java.awt.image创建一个java.awt.image.buffereImage。这里有一些代码可以做到这一点,从

现在你有了一个BuffereImage,你可以使用坐标的多边形,你必须把不是人的像素变成透明的。只需使用BuffereImage中提供的方法


你不能直接从BuffereImage中剪切多边形。BuffereImage必须是矩形。你能做的最好的事情就是把你不想要的部分变成透明的。或者,您可以将所需的像素放在另一个矩形缓冲区图像上。

我不确定,但Graphics2D类有一种方法可以接受多边形,我认为它可以满足您的需要


因此,从您的图像创建一个BuffereImage,并使用
createGraphics()

获取Graphics2D对象,我不确定,但Graphics2D类有一种方法可以接受多边形,我想它可以满足您的需要


因此,从图像中创建一个BuffereImage,并使用
createGraphics()

获取Graphics2D对象。那么,您想根据人的形状准确地切割人吗?你意识到这不是一件小事吗?计算机很难识别图像中的东西。在标准Java库中当然没有简单的API来实现这一点。嗨,Jesper,谢谢你的回复,我有坐标,也就是说,我有多边形点(坐标)来切割人的形状。有了这个我们能做些什么吗?那么,你想根据男人的形状准确地切割男人吗?你意识到这不是一件小事吗?计算机很难识别图像中的东西。在标准Java库中当然没有简单的API来实现这一点。嗨,Jesper,谢谢你的回复,我有坐标,也就是说,我有多边形点(坐标)来切割人的形状。有了这个我们能做什么吗?
/**
 * @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;
    }

}