首页 > 编程 > Java > 正文

java实现图片角度旋转并获得图片信息

2019-11-26 09:17:19
字体:
来源:转载
供稿:网友

本文实例为大家分享了java实现图片角度旋转并获得图片信息的具体代码,供大家参考,具体内容如下

public class Demo {  /** * 调整图片角度 * make by dongxh 2017年11月1日下午3:51:08 * @param src * @param angel * @return */ public static BufferedImage rotate(Image src, int angel) {   int src_width = src.getWidth(null);   int src_height = src.getHeight(null);   // calculate the new image size   Rectangle rect_des = CalcRotatedSize(new Rectangle(new Dimension(     src_width, src_height)), angel);    BufferedImage res = null;   res = new BufferedImage(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);   return res;  }  /** * 计算旋转参数 * make by dongxh 2017年11月1日下午3:51:29 * @param src * @param angel * @return */ 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 / 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(new Dimension(des_width, des_height));  }   /** * 获得图片调整角度 * make by dongxh 2017年11月1日下午3:40:20 * @param imgFile * @return */ public static Integer getImgRotateAngle(String imgFile){ Integer angel = 0; Metadata metadata = null; try{ if(StringUtils.isBlank(imgFile))return angel; File _img_file_ = new File(imgFile); if(!_img_file_.exists())return angel; metadata = JpegMetadataReader.readMetadata(_img_file_); Directory directory = metadata.getDirectory(ExifDirectory.class);  if(directory != null && directory.containsTag(ExifDirectory.TAG_ORIENTATION)){ int orientation = directory.getInt(ExifDirectory.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(Exception e){ e.printStackTrace(); } return angel; }  /** * 调整图片角度 * make by dongxh 2017年11月1日下午4:31:20 * @param imgFile */ public static void rotateImage(String imgFile){ try { if(StringUtils.isBlank(imgFile)){ File _img_file_ = new File(imgFile); if(_img_file_.exists()){  Integer angel = getImgRotateAngle(imgFile);  if(angel==0)return;  BufferedImage src = ImageIO.read(_img_file_);   BufferedImage des = rotate(src, angel);   ImageIO.write(des,"jpg", _img_file_); } } } catch (IOException e) { e.printStackTrace(); } }  public static void main(String[] args)throws Exception{ String fromPic = "d://88888//IMG_20171004_122718.jpg"; //rotateImage(file);  Integer angel = getImgRotateAngle(fromPic); System.out.println(angel); Thumbnails.of(fromPic)  .rotate(angel)   .scale(0.2f)  .outputFormat("jpg")  .outputQuality(0.2f)  .toFile(fromPic);  System.out.println("==End=="); } } 

获得图片使用metadata-extractor

<dependency> <groupId>com.drewnoakes</groupId> <artifactId>metadata-extractor</artifactId> <version>2.4.0-beta-1</version></dependency>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表