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"。
取到这些值,就可以进行相应的操作了。
Java 处理 iphone拍照后 图片EXIF属性翻转90度的方法的更多相关文章
- JS 解决 IOS 中拍照图片预览旋转 90度 BUG
		上篇博文[ Js利用Canvas实现图片压缩 ]中做了图片压缩上传,但是在IOS真机测试的时候,发现图片预览的时候自动逆时针旋转了90度.对于这个bug,我完全不知道问题出在哪里,接下来就是面向百度编 ... 
- java简单web爬虫(网页图片)
		java简单web爬虫(网页图片)效果,执行main()方法后图片就下载道C盘的res文件夹中.没有的话创建一个文件夹代码里的常量根据自己的需求修改,代码附到下面. package com.sinit ... 
- android拍照获得图片及获得图片后剪切设置到ImageView
		ok,这次的项目需要用到设置头像功能,所以做了个总结,直接进入主题吧. 先说说怎么 使用android内置的相机拍照然后获取到这张照片吧 直接上代码: Intent intentFromCapture ... 
- Java读取图片exif信息实现图片方向自动纠正
		起因 一个对试卷进行OCR识别需求,需要实现一个功能,一个章节下的题目图片需要上下拼接合成一张大图,起初写了一个工具实现图片的合并,程序一直很稳定的运行着,有一反馈合成的图片方向不对,起初怀疑是本身图 ... 
- Java乔晓松-android中调用系统拍照功能并显示拍照的图片
		android中调用系统拍照功能并显示拍照的图片 如果你是拍照完,利用onActivityResult获取data数据,把data数据转换成Bitmap数据,这样获取到的图片,是拍照的照片的缩略图 代 ... 
- Android 从本地图库或拍照后裁剪图片并设置头像
		在QQ和微信等应用都会有设置头像,一般都是从本地图库选取或相机拍照,然后再截图自己喜欢的部分,然后设置.最后一步把截取好的图片再保存到本地,来保存头像.为了大家使用方便,我把自己完整的代码贴出来,大家 ... 
- C#/.net 通过js调用系统相机进行拍照,图片无损压缩后进行二维码识别
		这两天撸了一个需求,通过 JS 调用手机后置相机,进行拍照扫码.前台实现调用手机相机,然后截取图片并上传到后台的功能.后台接收传过来的图片后,通过调用开源二维码识别库 ZXing 进行二维码数据解析 ... 
- 移动端 Iphone拍照变横问题的解决
		在移动端的页面需要做用户拍照上传的功能时会有用,苹果即使竖着拍照,上传到网页后它也会变成横的,好像IOS得一个BUG,安卓就没有这个问题. 要解决这个问题需要引入exif.js这个库,网上随便搜一下就 ... 
- 七牛--关于图片上传方向不统一的问题--主要关于图片EXIF信息中旋转参数Orientation的理解
		[图片引用方向纠正]直接在图片后面添加 ?imageMogr/auto-orient eg:http://data.upfitapp.com/data/2016/10/18/1629114767606 ... 
随机推荐
- day1 查看当前目录命令:pwd
			用到查看当前目录的完整路径使用:pwd 物理路径和连接路径什么鬼?没明白暂时借鉴别人的记录下 显示当前目录的物理路径 pwd –P 1: [root@DB-Server init.d]# cd /et ... 
- PXC中的GTIDs
			基本环境:PXC 5.7.19 Row+Gtid,3节点 一.Galera GTID vs MySQL GTID 1.1.Galera GTID vs MySQL GTID Both kinds of ... 
- 初识java和C的不同
			学习java语言,发现C语言的语法尽管很类似,但是java的代码编写与C语言却大不相同. 一,java的类,首先接触到的是类这个思想,类中可以定义属性,可以用方法来对属性进行相应的操作: 二,jav ... 
- iOS视频流开发(1)—视频基本概念
			iOS视频流开发(1)-视频基本概念 手机比PC的优势除了便携外,她最重要特点就是可以快速方便的创作多媒体作品.照片分享,语音输入,视频录制,地理位置.一个成功的手机APP从产品形态上都有这其中的一项 ... 
- Python|绝不乱入的靠谱书单
- [转]解决win7 64位操作系统下安装PL/SQL后连接报错问题: make sure you have the 32 bits oracle client installed
			1. 在Oracle官网(http://www.oracle.com/technetwork/topics/winsoft-085727.html)下载文件: instantclient-basic- ... 
- centos系统中perl进程病毒占用大量网络流量导致网络瘫痪的问题分析及解决方案
			故障现象: 1.系统在早上9点的时候非常慢,单台服务器占用流量很大,使交换机流量被占满,而连累挂在同一交换机上的其他应用也无法提供服务,或者速度非常慢 2.通过查看进程发现大量的perl程序占 ... 
- MySQL双版本共存解决方案
			案例是MySQL5.5(3306端口)和MySQL5.6(3307端口). 1. 修改C:\Program Files (x86)\MySQL\MySQL Server 5.6\下的my-xxx.in ... 
- 京东在html5页面中打开本地app的解决方案
			转:https://blog.csdn.net/CameloHuang/article/details/64476385 从html5打开本地的app–如果本地没有app就跳转到下载页面,大家都会认为 ... 
- javaMelody监控javaWeb程序性能
			JavaMelody应用监控使用指南 原文:<JavaMelody应用监控使用指南> 前言 本文参考JavaMelody的UserGuide编写,部分文字均来自文档,添加有个人理解.并进行 ... 
