图片缩略图和点击查看大图旋转角度不一致,宽高读取错误

1:问题

deepin系统开发,发现图片缩率图和点击查看大图的旋转角度不一致.java读取图片的宽高和图片查看器上显示的宽高不一致.

而且我们的算法部门判断这个图片的角度错误.比如缩率图正常,但是大图倒立的图片,算法部门可能价值查出来是正常的.

2:原因

有的手机\相机拍照原图会给图片额外的信息.其中包过一个旋转角度如下图;需要获取下;

3:处理

 

  引入maven

<dependency>
<groupId>com.drewnoakes</groupId>
<artifactId>metadata-extractor</artifactId>
<version>2.16.0</version>
</dependency>
//java代码读取这个属性得到角度
public static void getRote(String path) {
Metadata metadata = null;
int orientation = 0;
int angel = 0;
try {
metadata = JpegMetadataReader.readMetadata(new File(path));
Iterable iterable = metadata.getDirectories();
for (Iterator iter = iterable.iterator(); iter.hasNext(); ) {
Directory dr = (Directory) iter.next();
if (dr.getString(ExifIFD0Directory.TAG_ORIENTATION) != null) {
orientation = dr.getInt(ExifIFD0Directory.TAG_ORIENTATION);
}
}
if (orientation == 3) {
angel = 180;
} else if (orientation == 6) {
angel = 90;
} else if (orientation == 8) {
angel = 270;
}
} catch (Exception e) {
System.out.println("获取角度失败");
return;
}
System.out.println("roteType: " + orientation);
System.out.println("旋转角度: " + angel);
}
4:其他
知道了有这个属性后想去掉这个属性,让缩率图和大图一致,可以读取下文件流或者byte后重写到一个文件中比如
ByteArrayInputStream bais = new ByteArrayInputStream(bytes1);
BufferedImage bi1 = ImageIO.read(bais);
File f1 = new File(filePath);
ImageIO.write(bi1, "jpg", f1);
bais.close();

或者使用Thumbnails工具旋转角度0 度.可以抹去额外的图片信息
BufferedImage buff = ImageIO.read(source);
int width = buff.getWidth();
int height = buff.getHeight();
Thumbnails.of(source).size(width, height).rotate(rotate).toFile(output);


posted @ 2021-10-14 20:27  尘逐风123  阅读(440)  评论(0编辑  收藏  举报