java 判断图片否旋转_java获取图片朝向并旋转
时间: 2023-12-17 13:06:01 浏览: 177
java实现图片角度旋转并获得图片信息
要判断图片是否旋转,可以通过读取图片的 Exif 信息来获取图片的朝向。Exif 是一种存储在 JPG、TIFF、RAW 等格式的照片中的元数据,其中包含了拍摄时的时间、地点、相机型号等信息,还包括图片的朝向。
Java 中可以使用 ImageIO 类读取图片的 Exif 信息,代码如下:
```
File file = new File("image.jpg");
ImageInputStream input = ImageIO.createImageInputStream(file);
Iterator<ImageReader> readers = ImageIO.getImageReaders(input);
if (readers.hasNext()) {
ImageReader reader = readers.next();
reader.setInput(input);
IIOMetadata metadata = reader.getImageMetadata(0);
Node root = metadata.getAsTree(metadata.getNativeMetadataFormatName());
Node orientationNode = findOrientationNode(root);
int orientation = getOrientation(orientationNode);
System.out.println("图片朝向:" + orientation);
}
```
其中,`findOrientationNode` 和 `getOrientation` 方法分别用于查找朝向节点和获取朝向值,代码如下:
```
private static Node findOrientationNode(Node root) {
Node orientationNode = null;
NodeList nodeList = root.getChildNodes();
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if ("{http://ns.adobe.com/exif/1.0/}IFD".equals(node.getNodeName())) {
orientationNode = findOrientationNode(node);
if (orientationNode == null) {
NamedNodeMap attributes = node.getAttributes();
if (attributes != null) {
orientationNode = attributes.getNamedItem("Orientation");
}
}
break;
}
}
return orientationNode;
}
private static int getOrientation(Node orientationNode) {
if (orientationNode == null) {
return 1;
}
String value = orientationNode.getNodeValue();
if (value == null) {
return 1;
}
return Integer.parseInt(value);
}
```
如果图片的朝向不是默认的 1,就需要将图片旋转到正确的方向。可以使用 Java 的 AffineTransform 类来进行图片旋转,代码如下:
```
File file = new File("image.jpg");
ImageInputStream input = ImageIO.createImageInputStream(file);
BufferedImage image = ImageIO.read(input);
int orientation = getOrientation(findOrientationNode(root));
AffineTransform transform = new AffineTransform();
switch (orientation) {
case 2:
transform.scale(-1.0, 1.0);
transform.translate(-image.getWidth(), 0);
break;
case 3:
transform.translate(image.getWidth(), image.getHeight());
transform.rotate(Math.PI);
break;
case 4:
transform.scale(1.0, -1.0);
transform.translate(0, -image.getHeight());
break;
case 5:
transform.rotate(Math.PI / 2);
transform.scale(-1.0, 1.0);
break;
case 6:
transform.rotate(Math.PI / 2);
transform.translate(0, -image.getHeight());
break;
case 7:
transform.rotate(-Math.PI / 2);
transform.scale(-1.0, 1.0);
transform.translate(-image.getHeight(), 0);
break;
case 8:
transform.rotate(-Math.PI / 2);
transform.translate(-image.getWidth(), 0);
break;
}
BufferedImage rotatedImage = new BufferedImage(image.getHeight(), image.getWidth(), image.getType());
Graphics2D g = rotatedImage.createGraphics();
g.setTransform(transform);
g.drawImage(image, 0, 0, null);
g.dispose();
ImageIO.write(rotatedImage, "jpg", new File("rotated.jpg"));
```
其中,根据不同的朝向值,使用不同的变换矩阵来旋转图片。最后使用 ImageIO 将旋转后的图片保存到文件中。
阅读全文