Atribuir AffineTransform a uma imagem

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 :slight_smile:

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.