2017-02-15 28 views
1

Основная проблема заключается в том, что я нарисовал изображение, которое является серым, и является границей прямоугольника формы. И я нарисовал фигуру над этим прямоугольником. Теперь мне нужно удалить область доступа из изображения.Как вычесть область изображения из формы

код, чтобы получить границы прямоугольника из форма:

public static Rectangle getBoundingBox(Shape shape,Graphics2D g) { 
    int minX = Integer.MAX_VALUE; 
    int minY = Integer.MAX_VALUE; 
    int maxX = Integer.MIN_VALUE; 
    int maxY = Integer.MIN_VALUE; 

    final Rectangle polygonBounds = shape.getBounds(); 

    int ax = polygonBounds.x; 
    int ay = polygonBounds.y; 
    int bx = ax + polygonBounds.width; 
    int by = ay + polygonBounds.height; 

    minX = Math.min(ax, minX); 
    minY = Math.min(ay, minY); 
    maxX = Math.max(bx, maxX); 
    maxY = Math.max(by, maxY); 


final Rectangle boundingBox = new Rectangle(minX, minY, 1, 1); 
boundingBox.add(maxX, maxY); 
return boundingBox; 
}  

код, чтобы нарисовать прямоугольник и выбранную форму является:

 Rectangle rect = getBoundingBox((Shape)selectedArea,g); 
     int x = (int)rect.getX(); 
     int y = (int)rect.getY(); 
     int width = (int)rect.getWidth(); 
     int height = (int)rect.getHeight(); 
     if((x+width)>grayScaledImage.getWidth()){ 
      width = grayScaledImage.getWidth()-x; 
     } 
     if(((y+height)>grayScaledImage.getHeight())){ 
      height = grayScaledImage.getHeight()-y; 
     } 

     BufferedImage img = grayScaledImage.getSubimage(x,y,width,height); 
      } 
      } 
     } 

     g.drawImage(img,x,y,null); 

И код серой шкалы изображения внутри прямоугольник:

 private BufferedImage toGray(BufferedImage image) { 
      int width = image.getWidth(); 
      int height = image.getHeight(); 
      for (int i = 0; i < height; i++) { 
       for (int j = 0; j < width; j++) { 
       Color c = new Color(image.getRGB(j, i)); 
       int red = (int) (c.getRed() * 0.3); 
       int green = (int) (c.getGreen() * 0.59); 
       int blue = (int) (c.getBlue() * 0.11); 

       int sum = red + green + blue; 
       Color newColor = new Color(sum, sum, sum); 
       //Color newColor =Color.red; 
       image.setRGB(j, i, newColor.getRGB()); 
       } 
      } 
      return image; 
    } 

Я уже пробовал с помощью метода setClip(), но у него так я вроде как проблема сглаживания. Поэтому было бы здорово помочь.

И изображение:

enter image description here

свет часть оттенками серого необходимо вычесть из изображения.

Требуемое изображение:

enter image description here

Многоугольник может быть любой формы.

+0

Можете сказать, какой результат вы хотите? Лучше сделать изображение, которое вы хотите в последний раз. –

+0

@BahramdunAdil Я хочу, чтобы нарисовать изображение в виде серого и цвет над любой формой многоугольника. –

+0

Вы хотите скопировать часть изображения с формой многоугольника и поместить его в новое изображение? Но лучше разместить изображение, которое вы хотите в конце, означает, какой результат вы хотите, чтобы изображение результата было, отредактировав вопрос и разместив изображение. –

ответ

0

Здесь я предлагаю вам попробовать этот способ: Вы можете создать Polygon объект и дать xPoints и yPoint. Что-то вроде этого

int[] xPoints; 
int[] yPoints; 
int length = xPoint.length; 
Polygon polygon = new Polygon(xPoints, yPoints, length); 

И теперь добавить цвет, как это:

Rectangle bounds = polygon.getBounds(); 
for (int i = 0; i < bounds.width; i++) { 
    for (int j = 0; j < bounds.height; j++) { 
     if (polygon.contains(i, j)) {// check if the point is inside the polygon 
      // do the color stuff here 
      Color c = new Color(image.getRGB(j, i)); 
      int red = (int) (c.getRed() * 0.3); 
      int green = (int) (c.getGreen() * 0.59); 
      int blue = (int) (c.getBlue() * 0.11); 

      int sum = red + green + blue; 
      Color newColor = new Color(sum, sum, sum); 
      //Color newColor =Color.red; 
      image.setRGB(j, i, newColor.getRGB()); 
     } 
    } 
} 

И что (без какого-либо дополнительного процесса)

+0

does() методы отличаются для формы, потому что это не обеспечивает хороший результат для формы. –

+0

этот метод не является стабильным, а многоугольник с серого масштабированного изображения не находится в его позиции –

+0

Но если вы хотите проверить, находится ли какая-либо точка внутри многоугольника, необходимо сначала создать объект многоугольника, а затем легко будет играть с. –

0

небольшая ошибка в коде: индексы инвертированный в цикле. Правильная версия:

Color c = new Color(image.getRGB(i, j)); 
     int red = (int) (c.getRed() * 0.3); 
     int green = (int) (c.getGreen() * 0.59); 
     int blue = (int) (c.getBlue() * 0.11); 

     int sum = red + green + blue; 
     Color newColor = new Color(sum, sum, sum); 
     //Color newColor =Color.red; 
     image.setRGB(i, j, newColor.getRGB());