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.
publicclassRotacionaIcone{doubleangulo;BufferedImageimagem;publicRotacionaIcone(BufferedImageimg,doubleang){angulo=ang;imagem=img;Graphics2Dg=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);AffineTransformaf=null;if(af==null)af=newAffineTransform();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.}}
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:
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?
F
FelipeMonte
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:
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
entanglement
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
FelipeMonte
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
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?
F
FelipeMonte
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.