Atribuir AffineTransform a uma imagem

7 respostas
F

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.

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.
    }
}

7 Respostas

E

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)

E

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?

F

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)

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.

E

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?

F

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.

E

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?

F

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?

A área útil da imagem é um cículo e o contorno (forma um quadrado) é transparente, logo pode ser cortado sem perda.

Criado 20 de maio de 2013
Ultima resposta 20 de mai. de 2013
Respostas 7
Participantes 2