Rotar una imagen en Java
-
Rotar una imagen en Java usando
BufferedImage
yGraphics2D.rotate()
- Rotar una imagen en Java usando Affine Transform
Este artículo presentará cómo podemos rotar una imagen en Java usando dos formas nativas.
Rotar una imagen en Java usando BufferedImage
y Graphics2D.rotate()
El primer método para rotar una imagen incluye el uso de la clase BufferedImage
y la clase Graphics2d
que viene con el paquete AWT. A continuación, creamos una función rotateImage()
que recibe un objeto BufferedImage
como parámetro y devuelve un objeto BufferedImage
girado.
En rotateImage()
, obtenemos el ancho, alto y tipo de la imagen usando los métodos getWidth()
, getHeight()
y getType()
. Ahora llamamos al constructor BufferedImage()
y pasamos las tres variables como argumentos y devuelve un objeto BufferedImage
newImageFromBuffer
.
Creamos una nueva imagen rotada usando el método createGraphics()
que devuelve un objeto Graphics2D
graphics2D
. Usando este objeto, llamamos a la función rotate()
que toma tres argumentos; el primero es el ángulo para rotar la imagen ya que queremos rotarla 90 grados pasamos Math.radians(90)
, el segundo y tercer argumento son las coordenadas x e y.
Finalmente, llamamos graphics2D.drawImage()
para dibujar la imagen rotada, que toma cuatro argumentos, el objeto BufferedImage
, el filtro a aplicar y las coordenadas x e y. Luego devolvemos el objeto newImageFromBuffer
.
En la función main
, leemos el archivo con File
y lo convertimos en un objeto BufferedImage
con ImageIO.read()
. Ahora llamamos a la función rotateImage()
y pasamos el objeto BufferedImage
devuelto y almacenamos el objeto BufferedImage
rotado. Ahora que tenemos la imagen rotada, necesitamos crear un nuevo archivo para almacenarla usando File
y ImageIO.write()
que toma el objeto BufferedImage
, su extensión y la ubicación del archivo vacío.
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();
}
}
}
Producción :
New Rotated Image File Path: C:\Users\User1\Documents\mountainsRotated.jpeg
Imagen original:
Imagen rotada:
Rotar una imagen en Java usando Affine Transform
Este ejemplo utiliza la clase AffineTransform
que mapea una imagen desde sus coordenadas 2D originales a otras coordenadas 2D linealmente sin perder la calidad original. En el siguiente programa, tenemos tres métodos, uno para leer y llamar a otras funciones, el segundo es rotar la imagen en el sentido de las agujas del reloj y la última función gira la imagen en el sentido contrario a las agujas del reloj.
En la función rotateImage()
, leemos la imagen usando new File()
y la convertimos en un objeto BufferedImage
usando ImageIO.read()
. Luego creamos otro objeto BufferedImage
que conserva las propiedades de la imagen original y lo llamamos output
. A continuación, llamamos al método rotateImageClockWise()
y pasamos la BufferedImage
original que devuelve un objeto de la clase AffineTransorm
.
rotateImageClockWise()
recibe la image
y obtiene la altura y el ancho. Creamos un objeto AffineTransform
y llamamos al método rotate()
usándolo. En rotate()
, pasamos tres argumentos; el primero es el ángulo de rotación medido en radianes, aquí pasamos Math.PI / 2
, los dos últimos argumentos son las coordenadas x e y que son la mitad del ancho y alto de la imagen.
Ahora, a medida que se gira la imagen, traducimos la imagen en las nuevas coordenadas usando la función translate()
que toma dos argumentos: la distancia para rotar en la dirección x y la distancia para rotar en la dirección y. Calculamos los argumentos x e y usando (imageWidth - imageHeight) / 2
.
Para rotar la imagen en sentido antihorario, podemos llamar al método rotateImageCounterClockwise()
en rotate()
en lugar 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();
}
}
}
Producción:
Imagen original:
Imagen girada en el sentido de las agujas del reloj:
Imagen girada en sentido antihorario:
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