Girar uma imagem em Java
-
Gire uma imagem em Java usando
BufferedImage
eGraphics2D.rotate()
- Girar uma imagem em Java usando Affine Transform
Este artigo irá apresentar como podemos girar uma imagem em Java usando duas maneiras nativas.
Gire uma imagem em Java usando BufferedImage
e Graphics2D.rotate()
O primeiro método para girar uma imagem inclui o uso de BufferedImage
e da classe Graphics2d
que vem com o pacote AWT. Abaixo, criamos uma função rotateImage()
que recebe um objeto BufferedImage
como parâmetro e retorna um objeto BufferedImage
girado.
Em rotateImage()
, obtemos a largura, altura e o tipo da imagem usando os métodos getWidth()
, getHeight()
e getType()
. Agora chamamos o construtor BufferedImage()
e passamos as três variáveis como argumentos e ele retorna um objeto BufferedImage
newImageFromBuffer
.
Criamos uma nova imagem girada usando o método createGraphics()
que retorna um objeto Graphics2D
graphics2D
. Usando este objeto, chamamos a função rotate()
que recebe três argumentos; o primeiro é o ângulo para girar a imagem, pois queremos girá-la 90 graus, passamos por Math.radians(90)
, o segundo e o terceiro argumentos são as coordenadas x e y.
Finalmente, chamamos graphics2D.drawImage()
para desenhar a imagem girada, que leva quatro argumentos, o objeto BufferedImage
, o filtro a ser aplicado e as coordenadas x e y. Em seguida, retornamos o objeto newImageFromBuffer
.
Na função main
, lemos o arquivo usando File
e então o convertemos em um objeto BufferedImage
usando ImageIO.read()
. Agora chamamos a função rotateImage()
e passamos o objeto BufferedImage
retornado e armazenamos o objeto BufferedImage
girado. Agora que temos a imagem girada, precisamos criar um novo arquivo para armazená-lo usando File
e ImageIO.write()
que leva o objeto BufferedImage
, sua extensão é a localização do arquivo vazio.
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class RotateImage {
public static BufferedImage rotateImage(BufferedImage imageToRotate) {
int widthOfImage = imageToRotate.getWidth();
int heightOfImage = imageToRotate.getHeight();
int typeOfImage = imageToRotate.getType();
BufferedImage newImageFromBuffer = new BufferedImage(widthOfImage, heightOfImage, typeOfImage);
Graphics2D graphics2D = newImageFromBuffer.createGraphics();
graphics2D.rotate(Math.toRadians(90), widthOfImage / 2, heightOfImage / 2);
graphics2D.drawImage(imageToRotate, null, 0, 0);
return newImageFromBuffer;
}
public static void main(String[] args) {
try {
BufferedImage originalImage = ImageIO.read(new File("mountains.jpeg"));
BufferedImage subImage = rotateImage(originalImage);
File rotatedImageFile = new File("C:\\Users\\User1\\Documents\\mountainsRotated.jpeg");
ImageIO.write(subImage, "jpg", rotatedImageFile);
System.out.println("New Rotated Image File Path: " + rotatedImageFile.getPath());
} catch (IOException e) {
e.printStackTrace();
}
}
}
Produção:
New Rotated Image File Path: C:\Users\User1\Documents\mountainsRotated.jpeg
Imagem original:
Imagem girada:
Girar uma imagem em Java usando Affine Transform
Este exemplo usa a classe AffineTransform
que mapeia uma imagem de suas coordenadas 2D originais para outras coordenadas 2D linearmente sem perder a qualidade original. No programa a seguir, temos três métodos, um para ler e chamar outras funções, o segundo é girar a imagem no sentido horário e a última função gira a imagem no sentido anti-horário.
Na função rotateImage()
, lemos a imagem usando new File()
e a convertemos em um objeto BufferedImage
usando ImageIO.read()
. Em seguida, criamos outro objeto BufferedImage
que preserva as propriedades da imagem original e o chamamos de output
. Em seguida, chamamos o método rotateImageClockWise()
e passamos o BufferedImage
original nele que retorna um objeto da classe AffineTransorm
.
rotateImageClockWise()
recebe a imagem
e obtém a altura e largura. Criamos um objeto AffineTransform
e chamamos o método rotate()
usando-o. Em rotate()
, passamos três argumentos; o primeiro é o ângulo de rotação medido em radianos, aqui passamos Math.PI / 2
, os dois últimos argumentos são as coordenadas x e y que são metade da largura e altura da imagem.
Agora, conforme a imagem é girada, traduzimos a imagem nas novas coordenadas usando a função translate()
que leva dois argumentos: a distância para girar na direção xe a distância para girar na direção y. Calculamos os argumentos x e y usando (imageWidth - imageHeight) / 2
.
Para girar a imagem no sentido anti-horário, podemos chamar o método rotateImageCounterClockwise()
em rotate()
em vez de rotateImageClockWise()
.
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
public class RotateImage {
private static final String INPUT_FILE_NAME = "mountains.jpeg";
private static final String OUTPUT_FILE_NAME = "mountainsRotated.jpeg";
private AffineTransform rotateImageClockWise(BufferedImage image) {
int imageWidth = image.getWidth();
int imageHeight = image.getHeight();
AffineTransform affineTransform = new AffineTransform();
affineTransform.rotate(Math.PI / 2, imageWidth / 2, imageHeight / 2);
double offset = (imageWidth - imageHeight) / 2;
affineTransform.translate(offset, offset);
return affineTransform;
}
private AffineTransform rotateImageCounterClockwise(BufferedImage image) {
int imageWidth = image.getWidth();
int imageHeight = image.getHeight();
AffineTransform affineTransform = new AffineTransform();
affineTransform.rotate(-Math.PI / 2, imageWidth / 2, imageHeight / 2);
double offset = (imageWidth - imageHeight) / 2;
affineTransform.translate(-offset, -offset);
return affineTransform;
}
private void rotateImage() throws Exception {
BufferedImage bufferedImage = ImageIO.read(new File(INPUT_FILE_NAME));
BufferedImage output = new BufferedImage(
bufferedImage.getHeight(), bufferedImage.getWidth(), bufferedImage.getType());
AffineTransform affineTransform = rotateImageClockWise(bufferedImage);
AffineTransformOp affineTransformOp =
new AffineTransformOp(affineTransform, AffineTransformOp.TYPE_BILINEAR);
affineTransformOp.filter(bufferedImage, output);
ImageIO.write(output, "jpg", new File(OUTPUT_FILE_NAME));
}
public static void main(String[] args) {
try {
RotateImage rotateImage = new RotateImage();
rotateImage.rotateImage();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Produção:
Imagem original:
Imagem girada no sentido horário:
Imagem girada no sentido anti-horário:
Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.
LinkedIn