[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]
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.
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);