packagecom.zhx.util.imgutil;importcom.drew.imaging.ImageMetadataReader;importcom.drew.imaging.ImageProcessingException;importcom.drew.imaging.jpeg.JpegProcessingException;importcom.drew.metadata.Directory;importcom.drew.metadata.Metadata;importcom.drew.metadata.MetadataException;importcom.drew.metadata.exif.ExifDirectoryBase;importjavax.imageio.ImageIO;import java.awt.*;importjava.awt.image.BufferedImage;importjava.io.File;importjava.io.IOException;
;/***@authorSimonHu
* @Description:
* @Created on 2018/7/30 22:18*/
public classRotateImage {public static void main(String[] args) throwsException {
String filePath ="C:\\Users\\admin\\Desktop\\222222222.jpg";
String newFilePath ="C:\\Users\\admin\\Desktop\\3333.png";
RotateImg(filePath,newFilePath);
}public static booleanRotateImg(String filePath,String newFilePath){try{
File file= newFile(filePath);
//测试发现文件大于7Mb以上时会出现读取速率很慢,找时间再改改;
Metadata metadata=ImageMetadataReader.readMetadata(file);
Directory directory= metadata.getFirstDirectoryOfType(ExifDirectoryBase.class);int orientation=0;//Exif信息中有保存方向,把信息复制到缩略图//原图片的方向信息
if(directory != null &&directory.containsTag(ExifDirectoryBase.TAG_ORIENTATION)){
orientation=directory.getInt(ExifDirectoryBase.TAG_ORIENTATION);
System.out.println(orientation);
}int angle=0;if(6 ==orientation ){//6旋转90
angle = 90;
}else if( 3 ==orientation){//3旋转180
angle = 180;
}else if( 8 ==orientation){//8旋转90
angle = 270;
}
BufferedImage src=ImageIO.read(file);
BufferedImage des=RotateImage.Rotate(src, angle);
String filename=file.getName();
String ext= filename.substring(filename.lastIndexOf(".") + 1).toLowerCase();
ImageIO.write(des,ext,newFile(newFilePath));return true;
}catch(JpegProcessingException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}catch(MetadataException e) {
e.printStackTrace();
}catch(ImageProcessingException e) {
e.printStackTrace();
}return false;
}public static BufferedImage Rotate(Image src, intangel) {int src_width = src.getWidth(null);int src_height = src.getHeight(null);//calculate the new image size
Rectangle rect_des = CalcRotatedSize(new Rectangle(newDimension(
src_width, src_height)), angel);
BufferedImage res= null;
res= newBufferedImage(rect_des.width, rect_des.height,
BufferedImage.TYPE_INT_RGB);
Graphics2D g2=res.createGraphics();//transform
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);returnres;
}public static Rectangle CalcRotatedSize(Rectangle src, intangel) {//if angel is greater than 90 degree, we need to do some conversion
if (angel >= 90) {if(angel / 90 % 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 Rectangle(newDimension(des_width, des_height));
}
}