Manter qualidade após rotação de imagens

6 respostas
E

Fala galera, seguinte: to fazendo o programa universo pessoal rotacionar imagens e tal, mas o problema é que as imagens perdem a qualidade depois da rotação: saca só os resultados:
Antes de rotacionar:
[IMG]http://img6.imagebanana.com/img/ssfrx3gw/thumb/teste1.png[/IMG]
Depois de rotacionar:
[IMG]http://img6.imagebanana.com/img/saf7ro3h/thumb/teste2.png[/IMG]
De longe tá lindo, mas deêm um zoom pra você verem a diferença.

O que eu faço é armazena r uma bufferedImage copiar, aplicar umas tranformações, e substituir a antiga. Vejam o código:
@Override
	public Desenho rotacionar(Dimension tamanho) {
		// TODO Auto-generated method stub
		AffineTransform af = new AffineTransform();
		af = new AffineTransform(0,1,-1,0,tamanho.getHeight(),0);
		Point2D origem = af.transform(new Point2D.Float(this.getOrigemX(), this.getOrigemY()), null);
		Point2D fim = af.transform(new Point2D.Float(this.getFimX(), this.getFimY()), null);
		this.setFimX((int) fim.getX())
		.setFimY((int)fim.getY())
		.setOrigemX((int)origem.getX())
		.setOrigemY((int)origem.getY());
		

//esse é o código onde eu aplico as tranformações
		af.setToRotation(90*Math.PI/180, this.imagem.getWidth(null)/2, this.imagem.getHeight(null)/2);
		
		BufferedImage novaImagem = new BufferedImage(this.imagem.getWidth(null), this.imagem.getHeight(null), BufferedImage.TYPE_USHORT_565_RGB);
		
		Graphics2D g =  (Graphics2D) novaImagem.getGraphics().create();
		g.transform(af);
		af.setToIdentity();
		AffineTransform afGeral = new AffineTransform();
		afGeral.translate(this.imagem.getWidth(null)/2, this.imagem.getHeight(null)/2);
		afGeral.scale(this.imagem.getHeight(null)/((float)this.imagem.getWidth(null)), this.imagem.getWidth(null)/((float)this.imagem.getHeight(null)));
		afGeral.translate(-this.imagem.getWidth(null)/2, -this.imagem.getHeight(null)/2);
		g.drawImage(  this.imagem,afGeral, null);
		g.dispose();
		this.setImagem(novaImagem.getSubimage(0, 0, this.imagem.getWidth(null), this.imagem.getHeight(null)));
		return this;
	}

Tem como eu melhorar isso usando aquela classe do AffineTransformOp? Se sim como?, Obrigado desde já.

6 Respostas

E

Up!!!

E

Up!!!

davidbuzatto

Elisson,

Pare com os UPs. Aqui não é comunidade de jogos, etc.
Espere a resposta à sua dúvida. Se quiser dar UP, poste novamente no seu tópico para melhorar a explicação da sua dúvida.
Fórum não é lugar de desespero, sendo assim, tenha paciência, evitando ser ignorado por esse tipo de comportamento

Se você estiver salvando essa imagem novamente, realmente você irá perder qualidade se o formato escolhido for jpg.

[]'s

E

Desespero?kkkkkkkkkkkkk.

Eu dou um up por semana e você chama isso de desespero??? Olha, logo vejo que você já postou bastante aqui, então você sabe, assim como eu, que os tópicos em salas movimentadas como essa não são respondidos e nem vistos após tanto tempo. Tenho certeza que, caso não tivesse dado esse up, você não teria respondido.

Sabe, eu também não acho bonito esses up, mas se fosse pra adicionar algo a explicação, editaria o primeiro post logo (o que já houvera feito antes, como você pode ver). Se o fórum oferecesse algum sistema de excluir os posts, eu excluiria os ups excessivos.

Quando você decidir fazer essas observações, sugiro também que as faça por mp, pois o assunto aqui não é esse. Quando alguém que passa por aqui e vê que alguém já respondeu, acha que não precisa ajudar e daí eu fico prejudicado.

Meu comportamento segue perfeitamente as regras deste fórum e acredito que qualquer moderador pode confirmar (ou não) isso.

Mas, voltando ao assunto: veja, meu programa é um editor imagens que está na minha assinatura. Se você for analisá-lo, verá que ele tem uma opção de rotacionar. Entretanto, quando eu assim o faço com alguma imagem, ela se distorce um pouco. O código acima mostra o que eu faço com uma BufferedImage ao rotacionar. Para imprimir, eu uso o método drawImage() em um JPanel personalizado. As imagens aí em cima foram retiradas deste JPanel. Ficava assim antes mesmo de eu salvar, então não é o formato(até porque é png).

C

Tem um jeito:

public BufferedImage rotacionar(BufferedImage imagem) {
  int width = imagem.getWidth();
  int height = imagem.getHeight();

  BufferedImage novo = new BufferedImage(height, width, BufferedImage.TYPE_INT_RGB);
  Graphics2D g = novo.createGraphics();

  for (int x = 0; x < width; x++) {
    for (int y = 0; y < height; y++) {
      g.setColor(new Color(imagem.getRGB(x, y)));
      g.fillRect(height - 1 - y, x, 1, 1);
    }
  }
  g.dispose();
  return novo;
}

N tenho certeza se vai funcionar pois estou num computador sem Java
Note tbem q desse jeito irá ter problemas de desempenho, imagens muito grandes podem demorar pra rotacionar.

E

Pois é, eu até pensei em usar isso no começo, mas daí esse problema do rendimento me desanimou, deixei pro java fazer mesmo, pra ver se com tempo eles criassem métodos mais rápidos para fazê-lo.

Tentei alguns código com o AffineTransformOp, e a imagem ficou melhor, e até rotacionou, mas de alguma forma o topo das imagens era cortado, não sei bem porque. Se alguém tiver outra dica, agradeço.

Criado 22 de setembro de 2011
Ultima resposta 13 de out. de 2011
Respostas 6
Participantes 3