# 上传照片并自动旋转

- URL: https://wuming.si/blog/418/
- Author: Aaron
- Published: 2013-12-09
- Language: zh-Hans
- Categories: Technology
- Originally published at: https://blog.wo.ai/archives/418

项目中有个需求，需要通过手机浏览器上传照片。本来是个很简单的事情，后来发现手机自带的陀螺仪会根据手机的方向变化而发生旋转，导致上传的照片容易发生偏转。后来查了一些资料，在图片的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种方向，另外四种除了旋转以外，还有镜像，根据手头的测试，没有发生镜像问题，所以就把它忽略掉了。
