Recortar imagens

Olá pessoal…
Estou precisando recortar certos elementos de uma BufferedImage colar em outra…Queria saber se isso é possível…

Quando eu quero recortar uma área retangular, a BufferedImage me oferece o método getSubimage(int x, int y, int w, int h) , que retorna uma BufferedImage da área definida. Em seguida eu “colo” (usando drawImage) ela em minha BufferedImage resultante…

Todavia, minha dúvida principal se dá com as formas irregulares…Se eu quiser recortar uma área elíptica, ou na forma de um polígono específico, tem como fazer?

Obrigado…

Olha eclipso, talvez tenha um jeito fácil de fazer, mas só me ocorre o difícil que seria algo assim:

  1. Criar uma imagem a parte (mesma dimensões da imagem original) com fundo preto e o desenho do polígono em branco (máscara).

  2. Pegar o array (rgb) da imagem original (getRGB), modificando cada valor com uma operação binária (&) com o valor rgb da máscara.

Como o valor rgb da máscara para os pontos que voce deseja estará no valor máximo (branco = 255,255,255 ou 0xFFFFFF), o resultado será um array de rgb da imagem original apenas para os pontos brancos da máscara.

É chato, mas acho que funciona.

Como bom nerd não resisti e implementei, e acredite, funcionou:

		try {
			BufferedImage image = ImageIO.read(new File("C:/suaimagemoriginal.jpg"));
			
			int width = image.getWidth();
			int height = image.getHeight();
			
			BufferedImage mascara = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
			Graphics gr = mascara.createGraphics();
			gr.setColor(Color.BLACK);
			gr.fillRect(0, 0, width, height);
			gr.setColor(Color.WHITE);
			gr.fillOval(30, 30, 250, 250);  //aqui vai o desenho do poligono que você quer
			
			int pontos_img[] = new int[width * height];
			image.getRGB(0, 0, width, height, pontos_img, 0, width);

			int pontos_mask[] = new int[width * height];
			mascara.getRGB(0, 0, width, height, pontos_mask, 0, width);
			
			for (int i = 0; i < pontos_img.length; i++) {
				pontos_img[i] = pontos_img[i] & pontos_mask[i];
				
			}
			
			image.setRGB(0, 0, width, height, pontos_img, 0, width);

			ImageIO.write(image, "jpg", new File("c:/lixo/imagemfinal.jpg"));
			
		}
		catch (Exception e) {
			e.printStackTrace();
		}

Cara…O pior é que eu ia implementar assim, hehehe…Mas achei que talvez a API gráfica do Java já fornecesse alguma abstração mais otimizada para esse processo de recorte…É que na minha aplicação eu queria fazer muitos recortes consecutivos e esse processo me parece um tanto pesado. Se bem que se a API já oferecesse algum método, é provável que não fugiria muito disso…

Valeu cara…Obrigado mesmo pela mão :wink:

OLha cara dá pre investir nesse algoritmo, tem como aperfeiçoar, por exemplo, operando somente com a região do polígono. Voce teria que descobrir os xmin,ymin,xmax,ymax do poligono e trabalharia somente neles… sei lá ! []s :stuck_out_tongue:

Se você olhar aquele demo do Java2D vai ver um monte de exemplos dessa parte de recorte de imagens.