`

JAVA 根据exif旋转图片

    博客分类:
  • JAVA
 
阅读更多

关于什么是exif不再多说,小伙伴们可以自己去查查。

 

由于项目使用的spring mvc上传组件,上传的参数为MultipartFile

 

使用的包为

 

 

<!--exif-->
<!-- https://mvnrepository.com/artifact/com.drewnoakes/metadata-extractor -->
<dependency>
	<groupId>com.drewnoakes</groupId>
	<artifactId>metadata-extractor</artifactId>
	<version>2.8.1</version>
</dependency>

 简单来说这是一个获取文件exif信息的包,当然他的功能还有很多,此处只用了很小的一个功能

 

File jpegFile = new File(deskURL);
FileUtil.byte2File(file.getBytes(),jpegFile);//将图片输出到文件中
Metadata metadata = ImageMetadataReader.readMetadata(jpegFile);
Collection<ExifIFD0Directory> directory = metadata.getDirectoriesOfType(ExifIFD0Directory.class);
ExifIFD0Directory db = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class);
//获取exif旋转信息
int orientation=db==null?1:db.getInt(ExifIFD0Directory.TAG_ORIENTATION);
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;
}
//旋转图片
BufferedImage src = ImageIO.read(jpegFile);
BufferedImage des = RotateImage.Rotate(src, turn);
//旋转图片后写入临时文件
ImageIO.write(des,FileUtil.getSuffix(deskURL), jpegFile);

其中的file是指上传的MultipartFile

我们将MultipartFile写入了一个临时文件中

对临时文件获取了其exif信息,根据exif信息确定了旋转的读书turn

然后对临时文件旋转之后又再次写入临时文件中

至此已经实现了标题所描述功能

下面放旋转图片的代码

package cn.org.dpm.cms.util;

import java.awt.*;
import java.awt.image.BufferedImage;
/**
 * 图片翻转工具
 * Created by LiaoKe on 2017/6/26.
 */
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处理图片上传旋转问题,前台后台讲解特别明了。

    2. **使用Canvas**:通过HTML5的`&lt;canvas&gt;`元素,可以绘制图片并根据Exif中的旋转信息进行旋转,然后将旋转后的图片转换为新的Base64编码,供后续上传。 3. **预览调整**:在图片上传前,展示一个经过旋转处理的预览...

    java 图片压缩 iphone拍照上传旋转问题处理压缩工具类

    然后,根据这个角度旋转图片。`getRotationAngle`方法需要实现从元数据中提取旋转角度的逻辑,这通常涉及到解析Exif中的`Orientation`字段。`rotateImage`方法则负责实际的图像旋转操作,可以使用Java AWT的`...

    修改图片exif信息示例(使用MediaUtil)

    ### 修改图片EXIF信息示例(使用MediaUtil) #### 一、引言 在数字图像处理领域,EXIF(Exchangeable Image File Format)是一种标准格式,用于存储图像文件中的元数据,包括拍摄时间、相机型号、光圈值、快门速度...

    Andriod下读取图片Exif信息Demo

    在Android平台上,开发人员经常需要处理图像数据,其中包括读取图片的Exif信息。Exif(Exchangeable Image File Format)是一种扩展的JPEG格式,用于存储与图像相关的信息,如拍摄日期、时间、地理位置、相机型号、...

    解决ios拍照上传图片被旋转

    5. 旋转图片后,更新BufferedImage对象,并将新的图像数据写回文件,同时删除原有的Exif信息,或者更新Orientation字段为正常值(1,表示无旋转)。 6. 最后,可以继续执行其他图片处理任务,如缩放、裁剪等。 以下...

    WPF 通过 EXIF 设置和读取图片的旋转信息.rar

    要手动处理EXIF旋转,我们需要先读取图像的EXIF数据,然后根据旋转信息进行相应的矩阵转换。可以使用第三方库如`libexif`或.NET Framework的`System.Drawing`命名空间来读取EXIF数据。以下是一个使用`System.Drawing...

    利用exif.is 对拍照的图片进行自动校正并下载

    它提供了一系列方法,如`readImage`用于读取图片的EXIF数据,`rotateImage`用于根据`Orientation`属性旋转图片,以及`fixOrientation`函数,它可以自动处理图片的旋转问题。 3. **利用exif.js进行图片校正**: 在...

    Exif信息获取

    - `TAG_ORIENTATION`: 图像的方向,用于旋转图片。 - `TAG_ISO_SPEED_RATING`: ISO感光度。 - `TAG_FOCAL_LENGTH`: 焦距。 - `TAG_EXPOSURE_TIME`: 曝光时间。 - `TAG_F_NUMBER`: 光圈值。 4. **读取Exif信息...

    实现图片旋转

    旋转图片的速度可能取决于图片的大小和处理算法的效率。为了提供良好的用户体验,可能需要实现异步处理,尤其是在处理大图或资源受限的设备上,防止阻塞用户界面。 5. **旋转算法**: 有两种常见的旋转算法:最近...

    java扫描图片

    如果需要读取图片的EXIF信息,如拍摄日期、相机型号等,可以使用`IIOMetadata`类。 7. **图像处理**: `BufferedImage`类提供了许多方法,如`getRGB()`, `setRGB()`, `createGraphics()`等,可以用来修改图像的颜色...

    读取数码照片EXIF信息源码

    2. **解析EXIF**:读取EXIF信息的过程通常涉及解析二进制流,找到EXIF数据段,然后根据定义的数据类型解析每个条目的值。例如,日期时间信息可能是字符串类型,而曝光时间可能是浮点数表示的秒数。 3. **关键EXIF...

    基于Java图片数据采集系统

    处理图片数据时,系统可能提供了图像处理功能,比如缩放、裁剪、旋转、滤镜效果等,这通常需要使用到Java的图像处理库,如Java AWT和Java2D,或者第三方库如OpenCV。此外,系统可能还支持图片的元数据读取和编辑,如...

    图片旋转Demo

    这些类提供了旋转图片的方法,通过指定旋转角度(通常是90度、180度或270度)来实现。旋转过程涉及到图片的矩阵变换,其中心点计算以及尺寸调整是关键步骤。例如,在Android中,可以使用Bitmap.createMatrix()创建一...

    android-exif:Exif 测试

    有时保存图片时设置了 Exif 旋转(例如:图片保存时旋转 90 度),而不是正确显示此图片,无论谁显示它,都应该在显示之前旋转图片。 因此,如果我在下载图片后(从字节 [] 或将图片保存到设备后)可以访问 Exif ...

    手机移动端上传图片压缩完美解决方案 LocalResizeIMG+EXIF+ASP后台上传(后台上传文件可自己替换成PHP或JAVA)

    手机移动端上传图片压缩完美解决方案 ...完美解决苹果手机拍照上传图片90度旋转问题,EXIF缩减后加入LocalResizeIMG文件,只要两个JS文件引用即可(jquery和LocalResizeIMG) 后台是ASP写的,可以替换成PHP或JAVA

    Fresco 二三事:图片处理之旋转、裁剪切割图片demo

    我们可以使用RotationOptions.autoRotate()让Fresco自动根据图片的Exif信息进行旋转,或者使用RotationOptions.atSourceRotation()保留原始的Exif旋转信息。例如: ```java ImageRequest request = ...

    java高级成像 jai库

    Java高级成像(Java Advanced Imaging,简称JAI)是一个用于图像处理和计算机视觉的Java库。JAI库提供了丰富的功能,包括图像的读取、写入、操作和转换,适用于科学、医疗、工程以及多媒体应用等领域。这个压缩包包...

    java 相片管理系统

    - **图像编辑**:集成基本的图像编辑功能,如裁剪、旋转、滤镜等,可以使用Java的`java.awt.image.BufferedImageOp`接口和相关类。 - **云同步**:通过API与云存储服务(如Google Drive或Dropbox)集成,实现照片的...

    三星照相默认旋转90度完美解决

    在Android系统中,如果手机处于横屏模式拍照,EXIF信息通常会记录这一情况,以便于在查看时自动旋转图片至正确方向。然而,有些情况下,这个信息可能没有被正确地写入或读取,从而导致了照片显示异常。 解决这个...

Global site tag (gtag.js) - Google Analytics