Обрезка изображения в Java - PullRequest
1 голос
/ 23 июня 2010

Я хочу вырезать определенную форму изображения в Java, например, изображение, которое содержит человека с белым фоном, здесь я хочу обрезать человека без фона. Не хочу делать это как прозрачное изображение, хочу вырезать с некоторыми координатами. Я думаю, что с помощью cropImageFilter мы можем только вырезать область прямоугольника. Может кто-нибудь сказать мне, как это сделать?

Ответы [ 2 ]

0 голосов
/ 23 июня 2010

Я не уверен, но класс Graphics2D имеет метод clip () , который принимает многоугольник, и я думаю, что делает то, что вам нужно.

Итак, создайте BufferedImage из вашего изображения и получите объект Graphics2D с createGraphics()

0 голосов
/ 23 июня 2010

Во-первых, вам нужно создать java.awt.image.BufferedImage из java.awt.Image.Вот некоторый код для этого: 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.

...