BufferedImage - Redimensinonando?

13 respostas
M

Tenho uma BufferedImage de tamanho 1024x768, como posso reduzí-la a 100x100 no Java sendo que a BufferedImage não me permite o uso de resize, nem setSize nem quaisquer coisas desse tipo.
Obrigado.

13 Respostas

ViniGodoy
  1. Crie uma nova BufferedImage de 100x100.
  2. Depois copie a antiga na nova.

BufferedImage smaller = new BufferedImage(100, 100, bigger.getType()); Graphics2D g2d = smaller.createGraphics(); g2d.drawImage(bigger, 0, 0, bigger.getWidth(), bigger.getHeight(), //Coordenadas da imagem original 0, 0, 100, 100, //Coordenadas do destino null) ; //Image observer. g2d.dispose();

Mais informações:
http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Graphics.html#drawImage(java.awt.Image,%20int,%20int,%20int,%20int,%20int,%20int,%20int,%20int,%20java.awt.image.ImageObserver)

Note que com esse método, você também poderia copiar só um pedaço da imagem original, para só um pedaço do destino. Você também poderia fazer um flip (basta inverter o width e o x nas coordenadas da imagem original).

ViniGodoy

Há outra alternativa, se você quiser só redimensionar:

Image smaller = bigger.getScaledInstance(100, 100, Image.SCALE_SMOOTH);
M

Muito obrigado pela ajuda assim tão rápido.
Estou testando agora, qualquer coisa volto a postar.
Até logo e obrigado denovo. XD

M
Image smaller = bigger.getScaledInstance(100, 100, Image.SCALE_SMOOTH);

Eu usei esse método, mas depois de reduzí-la não consigo salvar ela, não da pra usar ImageIO.write(image,formato,arquivo) com uma forma Image pelo que parece e não consigo transportar Image para BufferedImage.
Ele diz que sun.awt.image.ToolkitImage cannot be cast to java.awt.image.BufferedImage.
Se alguém puder me dar uma ajuda com isso agora, agradeço, valeu.

ViniGodoy

E porque não usa o primeiro método, então? Dali já sai um BufferedImage!

Você pode transforma-lo numa função:

public BufferedImage scale(Image bigger, int newWidth, int newHeight) { BufferedImage smaller = new BufferedImage(newWidth, newHeight, bigger.getType()); Graphics2D g2d = smaller.createGraphics(); g2d.drawImage(bigger, 0, 0, bigger.getWidth(), bigger.getHeight(), //Coordenadas da imagem original 0, 0, smaller.getWidth(), smaller.getHeight(), null) ; //Coordenadas do destino g2d.dispose(); return smaller; }
Daí é só chamar:

BufferedImage smaller = scale(bigger, 100, 100);
M

Estava vendo isso, é que parece que havia algum argumento a mais dentro da definição do g2d, não sei, vou tentar com o que você me passou agora.
Valeu mesmo pela ajuda cara.

ViniGodoy

É verdade. O último argumento é um ImageObserver. Esqueci dele, pode só colocar null.

M

OK, vou tentar isso obrigado.

M

Funcionou, mas a imagem ficou cortada, ele trouxe apenas um pedaço, acho que tem a ver com a posição x e y.

M

Tentei colocar a posição de acordo com o tamanho total da img, mas voltou tudo preto então voltei as posições pra 0, mas tá trazendo só um pedaço dela mesmo…

ViniGodoy

Estranho, sempre usei esse método e nunca tive problemas.

M

Não sei, eu tentei tirando a parte debaixo deixei apenas a primeira linha e ele voltou uma imagem totalmente preta, ja com o resto dos comandos ele retorna apenas parte da imagem, é muito estranho, ela parece estar ampliada também. Acho que ele cortou 100x100 a partir da posição 0,0… e parece que ela está sendo ampliada.

M

Será que não poderia ser a versão do Java ou talvez porque estou usando NetBeans?

Criado 5 de dezembro de 2007
Ultima resposta 5 de dez. de 2007
Respostas 13
Participantes 2