2010-06-23 6 views
1

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

+0

Итак, вы хотите, чтобы вырезать человек точно, в соответствии с формой человека? Вы понимаете, что это не тривиальная задача? Компьютер очень легко распознает вещи в изображении. Для этого, конечно, нет простого API в стандартной библиотеке Java. – Jesper

+0

Привет, Jesper, спасибо за ваш ответ, я координирую со мной i.e У меня есть точки полигона (координаты), чтобы обрезать форму мужчины. С этим мы можем сделать что-нибудь? – SWDeveloper

ответ

0

Во-первых, вам нужно создать 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.

0

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

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

Смежные вопросы