项目中有个需求,需要通过手机浏览器上传照片。本来是个很简单的事情,后来发现手机自带的陀螺仪会根据手机的方向变化而发生旋转,导致上传的照片容易发生偏转。后来查了一些资料,在图片的EXIF信息中包含了照片的方向。
下载了metadata-extractor类,用来解析照片中的exif信息。
通过下面的方法得到方向:
public static int getImageOrientationTag(File f){
Metadata metadata;
try {
metadata = JpegMetadataReader
.readMetadata(f);
Directory exifDirectory = metadata.getDirectory(ExifDirectory.class);
if(exifDirectory.containsTag(ExifDirectory.TAG_ORIENTATION)){
return exifDirectory.getInt(ExifDirectory.TAG_ORIENTATION);
}
} catch (JpegProcessingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MetadataException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return -1;
}
下面的方法来旋转照片:
public static void autoRotateImageByExif(String srcFile,String desFile){
try {
File in = new File(srcFile); // 读入文件
BufferedImage src = javax.imageio.ImageIO.read(in);
int orientation = getImageOrientationTag(in);
switch (orientation) {
case 1:
case -1: //不需要旋转
FileUtil.copyFile(srcFile, desFile);
break;
case 8: //旋转270度
rotateImg(src, 270, Color.BLACK, desFile);
break;
case 3: //旋转180度
rotateImg(src, 180, Color.BLACK, desFile);
break;
case 6: //旋转90度
rotateImg(src, 90, Color.BLACK, desFile);
break;
default:
break;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // 构造Image对象
}
根据exif权威解释,总共有8种方向,另外四种除了旋转以外,还有镜像,根据手头的测试,没有发生镜像问题,所以就把它忽略掉了。