<dependency>
<groupId>com.drewnoakes</groupId>
<artifactId>metadata-extractor</artifactId>
<version>2.11.0</version>
</dependency>
import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import com.drew.imaging.jpeg.JpegMetadataReader; import com.drew.imaging.jpeg.JpegProcessingException; import com.drew.metadata.Directory; import com.drew.metadata.Metadata; import com.drew.metadata.MetadataException; import com.drew.metadata.exif.ExifDirectoryBase; public class Demo { // 处理ios图片旋转的问题 public static void getPictureByName(String filePath,String name){ try { //name为前端请求图片名,如 a.jpg BufferedImage src = getPicture(filePath+name); BufferedImage bi = null; //图片存在 if(src != null){ //获取图片旋转角度 int angel = getRotateAngleForPhoto(filePath+name); //图片被翻转,调整图片 if(angel != 0){ int src_width = src.getWidth(null); int src_height = src.getHeight(null); Rectangle rect_des = CalcRotatedSize(new Rectangle(new Dimension(src_width, src_height)), angel); bi = new BufferedImage(rect_des.width, rect_des.height,BufferedImage.TYPE_INT_RGB); Graphics2D g2 = bi.createGraphics(); g2.translate((rect_des.width - src_width) / 2, (rect_des.height - src_height) / 2); g2.rotate(Math.toRadians(angel), src_width / 2, src_height / 2); g2.drawImage(src, null, null); int index = name.lastIndexOf("."); String formate = name.substring(index+1); ImageIO.write(bi, formate, new File(filePath+name)); } }else{ //图片不存在 System.out.println("图片不存在"); } } catch (Exception e) { e.printStackTrace(); } } /** * 读取指定图片 */ public static BufferedImage getPicture(String path) { BufferedImage bi = null; try{ File file = new File(path); if(!file.exists()){ return null; } bi = ImageIO.read(file); } catch (Exception e){ e.printStackTrace(); } return bi; } /** * 图片翻转时,计算图片翻转到正常显示需旋转角度 */ public static int getRotateAngleForPhoto(String fileName){ File file = new File(fileName); int angel = 0; Metadata metadata; try{ metadata = JpegMetadataReader.readMetadata(file); Directory directory = metadata.getFirstDirectoryOfType(ExifDirectoryBase.class); if(directory != null && directory.containsTag(ExifDirectoryBase.TAG_ORIENTATION)){ // Exif信息中方向 int orientation = directory.getInt(ExifDirectoryBase.TAG_ORIENTATION); // 原图片的方向信息 if(6 == orientation ){ //6旋转90 angel = 90; }else if( 3 == orientation){ //3旋转180 angel = 180; }else if( 8 == orientation){ //8旋转90 angel = 270; } } } catch(JpegProcessingException e){ e.printStackTrace(); } catch(MetadataException e){ e.printStackTrace(); } catch(Exception e){ e.printStackTrace(); } System.out.println("图片旋转角度:" + angel); return angel; } /** * 计算旋转参数 */ public static Rectangle CalcRotatedSize(Rectangle src,int angel){ // if angel is greater than 90 degree,we need to do some conversion. if(angel > 90){ if(angel / 9%2 ==1){ int temp = src.height; src.height = src.width; src.width = temp; } angel = angel % 90; } double r = Math.sqrt(src.height * src.height + src.width * src.width ) / 2 ; double len = 2 * Math.sin(Math.toRadians(angel) / 2) * r; double angel_alpha = (Math.PI - Math.toRadians(angel)) / 2; double angel_dalta_width = Math.atan((double) src.height / src.width); double angel_dalta_height = Math.atan((double) src.width / src.height); int len_dalta_width = (int) (len * Math.cos(Math.PI - angel_alpha - angel_dalta_width)); int len_dalta_height = (int) (len * Math.cos(Math.PI - angel_alpha - angel_dalta_height)); int des_width = src.width + len_dalta_width * 2; int des_height = src.height + len_dalta_height * 2; return new java.awt.Rectangle(new Dimension(des_width, des_height)); } public static void main(String[] args) throws Exception { String filePath ="d:/" ; String filename = "333.jpg"; //处理ios图片旋转的问题 getPictureByName(filePath,filename); } }