java實現(xiàn)圖片角度旋轉(zhuǎn)并獲得圖片信息
更新時間:2019年02月10日 09:47:23 作者:fackyou200
這篇文章主要為大家詳細介紹了java實現(xiàn)圖片角度旋轉(zhuǎn)并獲得圖片信息,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了java實現(xiàn)圖片角度旋轉(zhuǎn)并獲得圖片信息的具體代碼,供大家參考,具體內(nèi)容如下
public class Demo { /** * 調(diào)整圖片角度 * 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; } /** * 計算旋轉(zhuǎn)參數(shù) * 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)); } /** * 獲得圖片調(diào)整角度 * 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旋轉(zhuǎn)90 angel = 90; }else if( 3 == orientation){ //3旋轉(zhuǎn)180 angel = 180; }else if( 8 == orientation){ //8旋轉(zhuǎn)90 angel = 270; } } }catch(Exception e){ e.printStackTrace(); } return angel; } /** * 調(diào)整圖片角度 * 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>
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
聊聊springboot靜態(tài)資源加載的規(guī)則
這篇文章主要介紹了springboot靜態(tài)資源加載的規(guī)則,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12Java程序員的10道常見的XML面試問答題(XML術(shù)語詳解)
包括web開發(fā)人員的Java面試在內(nèi)的各種面試中,XML面試題在各種編程工作的面試中很常見。XML是一種成熟的技術(shù),經(jīng)常作為從一個平臺到其他平臺傳輸數(shù)據(jù)的標準2014-04-04Java Swing JRadioButton單選按鈕具體使用
這篇文章主要介紹了Java Swing JRadioButton單選按鈕具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-12-12Spring Boot Excel文件導出下載實現(xiàn)代碼
這篇文章帶領(lǐng)我們直接實現(xiàn)Excel文件的直接導出下載,后續(xù)開發(fā)不需要開發(fā)很多代碼,直接繼承已經(jīng)寫好的代碼,增加一個Xml配置就可以直接導出。具體實現(xiàn)代碼大家跟隨小編一起通過本文學習吧2018-11-11異常解決SpringBoot項目啟動卡住,無任何異常信息問題
這篇文章主要介紹了異常解決SpringBoot項目啟動卡住,無任何異常信息問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03springboot中swagger、異步/定時/郵件任務的問題
這篇文章主要介紹了springboot中swagger、異步/定時/郵件任務的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-07-07