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

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

【问题讨论】:

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

标签: java image crop


【解决方案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 对象

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-22
      • 1970-01-01
      • 2015-02-02
      • 2018-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多