java中的图像裁剪

时间:2010-06-23 06:53:21

标签: java image crop

我想在java中剪切图像的特定形状,例如包含白色背景的男人的图像,在这里我想裁剪没有背景的人。不想让它成为透明图像,想要用一些坐标切割。我认为使用cropImageFilter我们只能剪切矩形区域。任何人都可以打电话给我怎么做?

2 个答案:

答案 0 :(得分: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上。

答案 1 :(得分:0)

我不确定但是类Graphics2D有一个接受多边形的方法clip(),我认为你需要它。

所以从你的图像创建一个BufferedImage,并获得带有createGraphics()

的Graphics2D对象