Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 395|回复: 0

java解决手机上传竖拍照片旋转90\180\270度问题

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-6-23 14:18:25 | 显示全部楼层 |阅读模式

     

     

    <dependency>
    <groupId>com.drewnoakes</groupId>
    <artifactId>metadata-extractor</artifactId>
    <version>2.11.0</version>
    </dependency>

     

     

    import java.awt.Dimension;
    import java.awt.Graphics2D;
    import java.awt.Rectangle;
    import java.awt.image.BufferedImage;
    import java.io.File;
    
    import javax.imageio.ImageIO;
    
    import com.drew.imaging.jpeg.JpegMetadataReader;
    import com.drew.imaging.jpeg.JpegProcessingException;
    import com.drew.metadata.Directory;
    import com.drew.metadata.Metadata;
    import com.drew.metadata.MetadataException;
    import com.drew.metadata.exif.ExifDirectoryBase;
    
    public class Demo {
        
    
        // 处理ios图片旋转的问题
        public static 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){
                        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 static 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 static int getRotateAngleForPhoto(String fileName){
    
            File file = new File(fileName);
    
            int angel = 0;
            Metadata metadata;
    
            try{
                metadata = JpegMetadataReader.readMetadata(file);
                Directory directory = metadata.getFirstDirectoryOfType(ExifDirectoryBase.class);
                if(directory != null && directory.containsTag(ExifDirectoryBase.TAG_ORIENTATION)){
                    // Exif信息中方向  
                    int orientation = directory.getInt(ExifDirectoryBase.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();
            } catch(Exception 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));
        }
    
     
         public static void main(String[] args) throws Exception {
             String filePath ="d:/" ;
             String filename = "333.jpg";
             //处理ios图片旋转的问题
             getPictureByName(filePath,filename);
        }
    }

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-3-9 08:58 , Processed in 0.063670 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表