蘋果手機(ios)拍照上傳圖片旋轉90度問題---java後臺處理
阿新 • • 發佈:2018-11-05
需要先匯入包 metadata-extractor-2.3.1.jar 地址 https://github.com/drewnoakes/metadata-extractor/releases?after=2.7.0 xmpcore-5.1.2.jar 依賴包 maven下載 mediation-1.0.0.jar 這個好像也用到了 程式碼: String filePath = request.getSession().getServletContext() .getRealPath("/") + "upload/" ; String filename = "111.jpg"; //處理ios圖片旋轉的問題 getPictureByName(filePath,filename); // 處理ios圖片旋轉的問題 public 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){ //圖片正常,不處理圖片 bi = src; }else{ //圖片被翻轉,調整圖片 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 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 int getRotateAngleForPhoto(String fileName){ File file = new File(fileName); int angel = 0; Metadata metadata; try{ metadata = JpegMetadataReader.readMetadata(file); Directory directory = metadata.getDirectory(ExifDirectory.class); if(directory.containsTag(ExifDirectory.TAG_ORIENTATION)){ // Exif資訊中方向 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(JpegProcessingException e){ e.printStackTrace(); } catch(MetadataException 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)); }