1. 程式人生 > >Java 處理 iphone拍照後 圖片EXIF屬性翻轉90度的方法

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

http://blog.csdn.net/ghsau/article/details/8472486

翻轉後 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));
    }
}



相關推薦

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

http://blog.csdn.net/ghsau/article/details/8472486 翻轉後 orientation 屬性為6 。 public static void main(String[] args) throws ImageProcessingE

android 5.1拍照圖片映象處理

這是mtk6735平臺的,可能每個平臺位置不太一樣,但改法基本相同 status_t CamAdapter::takePicture() 這個函式裡面新增 //後攝拍照圖片映象 if(strcmp(value,"true") == 0) { if (getOpenId(

Android呼叫相機拍照圖片橫向顯示的問題解決

最近在做一個專案的時候出現需要實時拍照然後作為頭像上傳伺服器的一個操作,按照以前的老專案老是出現拍照後對 圖片處理的問題上圖片橫向顯示,這樣切割出來的圖片也就是橫向了,找了很久才解決出來問題的根源,現在記錄下來, 以後遇到這個問題就不會出錯了。 1:一般相機拍完照後正常顯示在螢幕上如圖,

java處理保留小數點幾位

方式一: 四捨五入   double   f   =   111231.5585;   BigDecimal   b   =   new   BigDecimal(f);   double   f1   =   b.setScale(2,   BigDecimal.RO

android拍照圖片路徑的獲取(解決不同手機存在拍照旋轉的問題)

呼叫拍照功能: Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(openCameraIntent, TAKE_PICTURE);

android 呼叫系統相機拍照圖片上顯示文字

 先說說自己的思路(有什麼欠缺的望噴。。。)    1、在xml 檔案寫入Imageview(用來顯示拍照圖片) 和textview (顯示想要顯示的文字)  2、將xml 佈局通過   LayoutInflater.from(context).inflate轉換為view檢

POI java 處理excel上傳圖片

在最近的專案開發中,遇到這樣一個需求,使用者匯入帶圖片的excel,excel批量匯入功能已做過很多了,帶圖片的是第一次嘗試,大概的要求有以下幾點: 所有excel中的圖片不能超出單元格,即必須在單元格內 所有圖片單個大小必須在1M以內 其中一列的單元格放入

ios豎直拍照使用canvas,圖片逆時針旋轉了90

vue專案 場景:壓縮圖片解析度 裝置:iPhone, bug:獲取圖片時選擇拍照,橫著拍照沒有問題,豎著拍照,通過canvas壓縮解析度發生逆時針90度旋轉的bug,pc端瀏覽器、android沒問題 vue檔案中 <script> import EX

已解決: Android 解決相機拍照或者選擇相簿翻轉的問題

老規矩,先上效果圖(雖然說不是很形象吧): 1.首先我們獲取一下相機拍照後翻轉的角度 /** * 讀取照片exif資訊中的旋轉角度 * @param path 照片路徑

Android拍照得到的照片旋轉了90

解決辦法: int degree = ImageUtil.readPictureDegree(imageUri.getPath()); Bitmap bmpOk = ImageUtil.rotate

蘋果手機(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下載 med

影象處理2_讀取JPG圖片Exif屬性(一)

例項分析:PICT0021.JPG00   FF D8 FF E1 3A 59 45 78 69 66 00 00 4D 4D 00 2A 10   00 00 00 08 00 0C 01 0E 00 02 00 00 00 0E 00 0020   03 F4 01 0F 00 02 00 00 00

java處理圖片--圖片的縮放,旋轉和馬賽克化

add 大小 count fun ref translate markdown 文件 new 這是我自己結合網上的一些資料封裝的java圖片處理類,支持圖片的縮放,旋轉,馬賽克化。(轉載請註明出處:http://blog.csdn.net/u012116

javajava處理隨機浮點數(小數點兩位)用RMB的大寫數值規則輸出

pen junit toc get code package 部分 amp print 晚上上床前,拿到這個有意思的問題,就想玩弄一番: ====================================================================

03 Spring框架 bean的屬性以及bean前處理和bean處理

and 設定 close https ali 註冊 override str return 上一節我們給出了三個小demo,具體的流程是這樣的: 1.首先在aplicationContext.xml中添加<bean id="自定義id" class="包名.類名"&g

Android獲取圖片資源之 拍照在程式中顯示照片

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

記錄SimpleDraweeView拍照 載入顯示所拍圖片,重複顯示第一張照片的問題

問題描述:     先拍照,使用SimpleDraweeView顯示照片的縮圖,但是遇到一個問題,就是重新拍照顯示的時候,都只是顯示拍的第一張照片的縮圖。試了修改了好多東西,最後發現 每次圖片 的名字都不一樣的話,才能顯示不同的圖。 程式碼如下: 一、xml

Android上傳圖片到伺服器並顯示(後臺用Java處理)

Android上傳圖片(Android Studio) Fragment介面: private String img_src; /** * 從相簿選取圖片 */ public void selectImg() { Intent intent = new

iphone中如何改變拍照圖片大小

- (UIImage *) scaleFromImage: (UIImage *) image toSize: (CGSize) size {     UIGraphicsBeginImageContext(size);     [image drawInRect:CGRectMake(0, 0,

Android拍照圖片裁剪、呼叫系統相簿(相容6.0以上許可權處理及7.0以上檔案管理)

前言: 最近工作修改較舊的專案時,涉及到了圖片相關功能 ,在使用安卓6.0手機及7.1手機拍照時,遇到了因許可權及檔案管理導致程式崩潰等問題。 剛好把功能修改完,把程式碼簡單地貼一下,方便以後使用。 本文demo包含以下要點: Android6.0執