java中的图像裁剪

Posted

技术标签:

【中文标题】java中的图像裁剪【英文标题】:Image cropping in java 【发布时间】:2010-06-23 06:53:20 【问题描述】:

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

【问题讨论】:

那么,你想根据男人的形状准确地剪出男人吗?您是否意识到这不是一项微不足道的任务?计算机很难识别图像中的事物。标准 Java 库中肯定没有简单的 API 来实现这一点。 嗨 Jesper,感谢您的回复,我已经与我协调,即我有多边形点(坐标)来切割人的形状。有了这个我们可以做些什么吗? 【参考方案1】:

首先,您需要从 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 上。

【讨论】:

【参考方案2】:

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

因此,从您的图像创建一个 BufferedImage,并使用 createGraphics() 获取 Graphics2D 对象

【讨论】:

以上是关于java中的图像裁剪的主要内容,如果未能解决你的问题,请参考以下文章

使用 Java 裁剪上传的图像

在 Java 中裁剪图像

Java Tapestry Web 应用程序中的基本图像编辑器(打开文件、裁剪、保存到新文件)

在Java中按多边形区域裁剪图像

使用 jQuery/Java 裁剪和上传图像

如何在 Java 中裁剪图像?