1. 程式人生 > >蘋果手機(ios)拍照上傳圖片旋轉90度問題---java後臺處理

蘋果手機(ios)拍照上傳圖片旋轉90度問題---java後臺處理

需要先匯入包  

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));
}