Gerar imagem

[b]Olá Galera!

Estou trabalhando com imagens, e estou manipulando zoom nessas imagens, precisava gerar uma nova imagem mas somente com a área capturada pelo zoom, a medidas desse retângulo eu já tenho! Minha duvida seria como gerar somente uma determinada área da imagem??

Se alguém puder me ajudar!!!

Valeu 8)
[/b]

Um meio seria:

  1. Tranforme a imagem em conjunto de pixels.
  2. Delimite a area do zoom neste conjunto de pixels.
  3. Aplique o algoritmo de zoom nos pixels.
  4. Crie uma nova imagem com os novos pixels.

Cara valeu!!!

Cheguei até o terceiro passo, mas agora não faço a mínima ideia de como gerar a nova imagem apartir do novo conjunto de pixels!!
Estou pesquisando desde ontem e não consigo achar uma solução!

Alguém poderia me ajudar?

Um jeito é assim:

public static Image toImage(byte[][] image){ int width = image.length; int height = image[0].length; BufferedImage bfImage = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB); for(int i=0; i<width; i++){ for(int j=0; j<height; j++){ if(image[i][j]==0){ bfImage.setRGB(i,j,Color.white.getRGB()); } if(image[i][j]==1){ bfImage.setRGB(i,j,Color.black.getRGB()); } if(image[i][j]==2){ bfImage.setRGB(i,j,Color.blue.getRGB()); } if(image[i][j]==3){ bfImage.setRGB(i,j,Color.red.getRGB()); } if(image[i][j]==4){ bfImage.setRGB(i,j,Color.green.getRGB()); } } } return bfImage.getScaledInstance(width, height,0); }

Funcionou bem com meu projeto, mas eu usava apenas imagens binárias.

Cara valeu pela força!! Acabou “dando certo”, está gerando a imagem invertida, mas acho que não deve ser dificil de resolver!!

Minha implementação ficou assim:

public static Image toImage(byte[][] image){
int width = image.length;
int height = image[0].length;
BufferedImage bfImage = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
for(int i=0; i<width; i++){
for(int j=0; j<height; j++){
Color color = new Color(image[i][j]);
image.setRGB(i,j,color.getRGB()); }
}
}
return bfImage.getScaledInstance(width, height,0);
}

Acho que mais fácil ainda é usar o método drawImage da classe Graphics.

Uma das suas assinaturas suporta as coordenadas da área de origem e as de destino. E a imagem é automaticamente redimensionada se o destino for maior ou menor que a origem.

Evita a manipulação direta de pixels, que é sempre mais arriscada. E também evita uma eventual calculeira. :slight_smile:

Para usar o drawImage você faz:

public BufferedImage geraZoom(BufferedImage origem, int x, int y, int w, int h, int zoomWidth, int zoomHeight) {
  //Criamos uma nova BufferedImage para armazenar o zoom
   BufferedImage destino = new BufferedImage(zoomWidth, zoomHeight, origem.getImageType());    

   //Obtemos o seu graphics 2d, para poder edita-la
   Graphics2D g2d = destino.createGraphics();

   //Desenhamos a área da imagem de origem no destino
   g2d.drawImage(origem, x, y, w, h, 
      0, 0, destino.getWidth(), destino.getHeight(), 
      NULL); //Não precisamos de um imageobserver

   //Agora que o desenho está pronto, liberamos o g2d
   g2d.dispose();

   //Retornamos a imagem com o zoom
   return destino;
}

Esse método ainda tem outra vantagem. Você pode escolher a qualidade da interpolação ao realizar o zoom.
O java suporta 3 tipos de interpolação: bilinear, bicubica ou "nearest neighbor’.

Para alterar a qualidade da interpolação, depois de criar o seu objeto graphics faça:

g2d.setRenderingHint(KEY_INTERPOLATION, VALUE_INTERPOLATION_BICUBIC);

ou

g2d.setRenderingHint(KEY_INTERPOLATION, VALUE_INTERPOLATION_BILINEAR);

ou

g2d.setRenderingHint(KEY_INTERPOLATION, VALUE_INTERPOLATION_NEAREST_NEIGHBOR);