Ola. Gostaria de saber como posso fazer um AffineTransform em uma imagem e atribuir esse resultado a outra imagem. Por exemplo, rotacionar uma imagem em 90º e armazenar a imagem transformada em outra imagem. O código abaixo mostra o meu problema.
Vale destacar que sei como rotacionar JLabel, mas esta solução não resolve o meu problema.
[code]public class RotacionaIcone {
double angulo;
BufferedImage imagem;
public RotacionaIcone (BufferedImage img, double ang){
angulo = ang;
imagem = img;
Graphics2D g = img.createGraphics();
g.setRenderingHint(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
AffineTransform af = null;
if (af == null)
af = new AffineTransform();
af.rotate(Math.toRadians(90), img.getWidth()/2, img.getHeight()/2);
g.drawImage(img, af, null); //aqui desenha a imagem transformada, mas nao sei como armazena-la em uma outra imagem.
}
}[/code]
Você pode combinar AffineTransforms - é melhor você guardar a imagem original e aplicar as AffineTransforms combinadas, em vez de guardar a imagem transformada e ficar aplicando sucessivas AffineTransforms, que irão progressivamente distorcer e diminuir a qualidade da imagem.
Para combinar AffineTransforms, use o método concatenate:
http://docs.oracle.com/javase/6/docs/api/java/awt/geom/AffineTransform.html#concatenate(java.awt.geom.AffineTransform)
De qualquer forma, você pode criar uma imagem a partir de outra usando exatamente o que você indicou - drawImage 
A propósito, você não reparou que quando você escreveu isto:
g.drawImage(img, af, null);
você alterou a imagem original, pelo que imagino?
[quote=entanglement]Você pode combinar AffineTransforms - é melhor você guardar a imagem original e aplicar as AffineTransforms combinadas, em vez de guardar a imagem transformada e ficar aplicando sucessivas AffineTransforms, que irão progressivamente distorcer e diminuir a qualidade da imagem.
Para combinar AffineTransforms, use o método concatenate:
http://docs.oracle.com/javase/6/docs/api/java/awt/geom/AffineTransform.html#concatenate(java.awt.geom.AffineTransform)[/quote]
Obrigado por responder, mas ainda assim não consegui ver a resolução do problema. Como eu poderia por a transformada em uma outra imagem?
Obs: a perda de qualidade é irrelevante, pois se trata de uma imagem bem simples.
Você quer uma coisa bem bitolada - rotacionar uma imagem de exatamente 90 graus. Vamos ver como é que se faz. Você precisa salvar essa imagem em um outro arquivo, ou precisa só visualizá-la na tela?
Na verdade, essa rotaçao vai ser altera pelo usuário, só coloquei 90º direto pra facilitar o entendimento do código. A imagem alterada vai gerar uma imagem de saída (ex: um .jpg de cabeça para baixo). A parte da exibição na tela o drawImage resolve, mas na hora que mando salvar isso no arquivo vai a original. O mesmo acontece quando uso JLabel.
Ah, você quer rotacionar e salvar um arquivo. Digamos que você queira rodar a imagem de 45 graus. Você vai:
a) Diminuir a imagem para que ela caiba dentro de um retângulo de mesma altura (ou largura)?
b) Deixar com a mesma altura e largura e perder um pedaço da imagem?
c) Aumentar a imagem de forma que, rotacionada, ela caiba?
[quote=entanglement]Ah, você quer rotacionar e salvar um arquivo. Digamos que você queira rodar a imagem de 45 graus. Você vai:
a) Diminuir a imagem para que ela caiba dentro de um retângulo de mesma altura (ou largura)?
b) Deixar com a mesma altura e largura e perder um pedaço da imagem?
c) Aumentar a imagem de forma que, rotacionada, ela caiba?
[/quote]
A área útil da imagem é um cículo e o contorno (forma um quadrado) é transparente, logo pode ser cortado sem perda.