Java 處理 iphone拍照后 圖片EXIF屬性翻轉90度的方法


http://blog.csdn.net/z69183787/article/details/50320821


 Java獲取照片EXIF信息
http://blog.csdn.net/ghsau/article/details/8472486

java解決手機等移動設備中照片上傳至服務器方向不正確的問題
http://www.bubuko.com/infodetail-715634.html

android 拍照的照片方向問題,讀取圖片EXIF信息
http://blog.csdn.net/yx0628/article/details/9429795

exif圖片方向處理
http://www.codes51.com/article/detail_625107.html
***************************************************

翻轉后 orientation 屬性為6 。

    public static void main(String[] args) throws ImageProcessingException, IOException {  
            File jpegFile= new File("C:\\Users\\Administrator\\Desktop\\IMG_0362.JPG");  
      
            Metadata metadata = ImageMetadataReader.readMetadata(jpegFile);  
            Directory directory = metadata.getDirectory(ExifIFD0Directory.class);  
            JpegDirectory jpegDirectory = (JpegDirectory)metadata.getDirectory(JpegDirectory.class);  
      
    //        int orientation =0;  
    //        Metadata metadata = JpegMetadataReader.readMetadata(newFile);  
    //        for (Directory directory : metadata.getDirectories())  
    //        {  
    //            for (Tag tag : directory.getTags())  
    //            {  
    //                if ("Orientation".equalsIgnoreCase(tag.getTagName()))  
    //                {  
    //                    orientation=getOrientation(tag.getDescription());  
    //                }  
    //            }  
    //        }  
    //        Integer turn=360;  
    //        if(orientation==0||orientation==1)  
    //        {  
    //            turn=360;  
    //        }  
    //        else if(orientation==3)  
    //        {  
    //            turn=180;  
    //        }  
    //        else if(orientation==6)  
    //        {  
    //            turn=90;  
    //        }  
    //        else if(orientation==8)  
    //        {  
    //            turn=270;  
    //        }  
      
      
            int orientation = 1;  
            try {  
                orientation = directory.getInt(ExifIFD0Directory.TAG_ORIENTATION);  
            } catch (MetadataException me) {  
                logger.warn("Could not get orientation");  
            }  
      
            System.out.println(orientation);  
      
            BufferedImage src = ImageIO.read(jpegFile);  
            BufferedImage des = RotateImage.Rotate(src, 90);  
            ImageIO.write(des,"jpg", new File("C:\\Users\\Administrator\\Desktop\\IMG_0362.JPG"));  
      
      
      
    //        FileInputStream fip = new FileInputStream(jpegFile);  
    //        LLJTran llj = new LLJTran(fip);  
    //        try {  
    //            llj.read(LLJTran.READ_INFO, true);  
    //        } catch (LLJTranException e) {  
    //            e.printStackTrace();  
    //        }  
    //  
    //        Exif exif = (Exif) llj.getImageInfo();  
    //        Entry e = new Entry(Exif.RATIONAL);  
    //        exif.setTagValue(Exif.ORIENTATION_TOPLEFT,1,e,true);  
    //        llj.refreshAppx(); // Recreate Marker Data for changes done  
    //        //改寫后的文件,文件必須存在  
    //        OutputStream out = new BufferedOutputStream(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\IMG_0362.JPG"));  
    //        // Transfer remaining of image to output with new header.  
    //        try {  
    //            llj.xferInfo(null, out, LLJTran.REPLACE, LLJTran.REPLACE);  
    //        } catch (LLJTranException e1) {  
    //            e1.printStackTrace();  
    //        }  
    //        fip.close();  
    //        out.close();  
    //        llj.freeMemory();  
        }  
      
        public static int getOrientation(String orientation)  
        {  
            int tag = 0;  
            if ("Top, left side (Horizontal / normal)".equalsIgnoreCase(orientation)) {  
                tag = 1;  
            } else if ("Top, right side (Mirror horizontal)".equalsIgnoreCase(orientation)) {  
                tag = 2;  
            } else if ("Bottom, right side (Rotate 180)".equalsIgnoreCase(orientation)) {  
                tag = 3;  
            } else if ("Bottom, left side (Mirror vertical)".equalsIgnoreCase(orientation)) {  
                tag = 4;  
            } else if ("Left side, top (Mirror horizontal and rotate 270 CW)".equalsIgnoreCase(orientation)) {  
                tag = 5;  
            } else if ("Right side, top (Rotate 90 CW)".equalsIgnoreCase(orientation)) {  
                tag = 6;  
            } else if ("Right side, bottom (Mirror horizontal and rotate 90 CW)".equalsIgnoreCase(orientation)) {  
                tag = 7;  
            } else if ("Left side, bottom (Rotate 270 CW)".equalsIgnoreCase(orientation)) {  
                tag = 8;  
            }  
            return  tag;  
        }  

 

翻轉:

    package com.xxxx.xxx.xxx.xxx;  
      
    import java.awt.*;  
    import java.awt.image.BufferedImage;  
      
    /** 
     * Created by Administrator on 2015/12/15. 
     */  
    public class RotateImage {  
        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;  
        }  
      
        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));  
        }  
    }  

 

上述api接口有了變化,已經不能使用,請參考下面的代碼

package testExif;

import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;

import javax.imageio.ImageIO;

import com.drew.imaging.jpeg.JpegMetadataReader;
import com.drew.metadata.Directory;
import com.drew.metadata.Metadata;
import com.drew.metadata.exif.ExifDirectoryBase;; 

public class TestExif {

    public static void main(String[] args) throws Exception {
        File file = new File("/pathToJepg/d3805d6c032a42feabce3deee74dfb6a.JPG");
        Metadata metadata = JpegMetadataReader.readMetadata(file);
        Directory directory = metadata.getFirstDirectoryOfType(ExifDirectoryBase.class);
        int orientation=0;
        if(directory != null && directory.containsTag(ExifDirectoryBase.TAG_ORIENTATION)){ // Exif信息中有保存方向,把信息復制到縮略圖
            orientation = directory.getInt(ExifDirectoryBase.TAG_ORIENTATION); // 原圖片的方向信息
            System.out.println(orientation);
        }
        
        if(orientation == 1){
            System.out.println("rotate 90");
            BufferedImage src = ImageIO.read(file);  
            BufferedImage des = RotateImage.Rotate(src, 270);  
            ImageIO.write(des,"jpg", new File("D:/upload/20170224/raw/90.jpg"));
        }
    }
}

 

圖片方向判定

 

                 if(6 == orientation ){
                       //6旋轉90
                       angle = 90;
                   }else if( 3 == orientation){
                      //3旋轉180
                       angle = 180;
                   }else if( 8 == orientation){
                      //8旋轉90
                       angle = 270;
                   }

總結

上面的RotateImage類可以工作,已經測試了幾組照片

*****************

補充:

       我們都遇到過這樣的情況,拍攝高的景物時,會把相機豎着拍,但是這樣得到的圖片如果用普通的圖片瀏覽器看景物就是躺着的,需要調整一個角度。


用手機拍照實驗(用普通瀏覽器來看):

橫拿手機右手拍照,照片方向"1""Horizontal"。

正常拿手機豎拍,照片方向"6""Rotate 90 CW",圖片順時針旋轉90度時,即正常。

再轉90度,橫拿,左手拍照,照片方向"3""Rotate 180",旋轉180度即可正常顯示方向。

再轉90度,手機頭朝下拍,照片方向"8""Rotate 270 CW"


取到這些值,就可以進行相應的操作了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM