Fórum rotação de imagem #452868

22/08/2013

0

Estou tentando efetuar a rotação de uma imagem e não está funcionando conforme códigos de exemplo disponíveis na internet.
Inicialmente, faço uma pequena varredura e "pego" dois pontos distintos da imagem: um na margem esquerda e outro na margem à direita
da imagem (pontos estratégicos). O ponto do lado direito está 9 pixels acima. O trecho de código a seguir ilustra o cálculo da diferença entre
esses dois pontos, sendo que calculo a diferença da altura entre eles (deslocamento vertical) e a distância entre eles:
    // como informação:  xA=67, xB= 1518,  yA=95 , yB=86  
  altu=yB-yA;  // diferença do y do lado direito com o y do lado esquerdo (resulta em -9) 
                          // pois o yB está deslocado para cima em relação ao YA
    larg=xB-xA;
  
    altD=altu;     // altD é um double, converte inteiro para o double
    largD=larg; // largD é um double,converte inteiro para double
   Double angulo = Math.atan(altD/largD); // como se fosse cateto oposto sobre cateto 
    radianos = angulo*Math.PI/180;
    // o angulo em radianos resulta  negativo, indicando que a rotação será no sentido horário, que é o desejado
   //===> valor do angulo em radianos = -1.0825473350213148E-4
  
   //em seguida utilizei dois métodos de exemplos, cada um usando instruções específicas
   //pesquisadas na internet
  //cada método retorna uma imagem do tipo BufferedImage e possuem a imagem e o angulo em radianos como parâmetros
   //PRIMEIRA CHAMADA
    imgSai=rotate(image,radianos);

  //SEGUNDA CHAMADA
    imgSai=rotaciona(image,radianos);
    ........ 
  //gravação da nova imagem gerada  
  ImageIO.write(imgSai, "jpeg", new File(arqSai));  

  //<< segue os trechos de código de cada método>>

public static BufferedImage rotate(BufferedImage image, double angle) 
	{
	    //double sin = Math.abs(Math.sin(angle)), cos = Math.abs(Math.cos(angle));
	    double sin = Math.sin(angle), cos = Math.cos(angle);
	    int w = image.getWidth(), h = image.getHeight();
	    int neww = (int)Math.floor(w*cos+h*sin), newh = (int)Math.floor(h*cos+w*sin);
	    
	    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
	    GraphicsDevice gd = ge.getDefaultScreenDevice();	    
	    GraphicsConfiguration gc = gd.getDefaultConfiguration();
	    
	    BufferedImage result = gc.createCompatibleImage(neww, newh, Transparency.OPAQUE);//TRANSLUCENT);
	    Graphics2D g = result.createGraphics();
	    g.translate((neww-w)/2, (newh-h)/2);
	    g.rotate(angle, w/2, h/2);
	    g.drawRenderedImage(image, null);
	    g.dispose();
	    return result;
	}
	
	public static BufferedImage rotaciona(BufferedImage image, double angulo)
	{
		BufferedImage sourceBI;

		BufferedImage destinationBI = null;
		
		sourceBI=image;
		
		Graphics2D g = (Graphics2D) sourceBI.getGraphics();
	    //g.drawImage(inputImage, 0, 0, null);

		AffineTransform at = new AffineTransform();
		at.scale(2.0,2.0);
		
		 at.rotate(angulo, sourceBI.getWidth() / 2.0, sourceBI
			        .getHeight() / 2.0);

		return sourceBI;
		
	}



Esse código grava a imagem sem alteração....
Vicente Camargo

Vicente Camargo

Responder

Posts

25/08/2013

Eduardo Pessoa

isso não é com o css?
Responder

Gostei + 0

26/08/2013

Vicente Camargo

Não. está sendo desenvolvido em swing...
Responder

Gostei + 0

26/08/2013

Eduardo Pessoa

desculpa.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar