Fórum rotação de imagem #452868
22/08/2013
0
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
Curtir tópico
+ 0Posts
25/08/2013
Eduardo Pessoa
Gostei + 0
26/08/2013
Vicente Camargo
Gostei + 0
26/08/2013
Eduardo Pessoa
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)