关于什么是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)); } }
相关推荐
2. **使用Canvas**:通过HTML5的`<canvas>`元素,可以绘制图片并根据Exif中的旋转信息进行旋转,然后将旋转后的图片转换为新的Base64编码,供后续上传。 3. **预览调整**:在图片上传前,展示一个经过旋转处理的预览...
然后,根据这个角度旋转图片。`getRotationAngle`方法需要实现从元数据中提取旋转角度的逻辑,这通常涉及到解析Exif中的`Orientation`字段。`rotateImage`方法则负责实际的图像旋转操作,可以使用Java AWT的`...
### 修改图片EXIF信息示例(使用MediaUtil) #### 一、引言 在数字图像处理领域,EXIF(Exchangeable Image File Format)是一种标准格式,用于存储图像文件中的元数据,包括拍摄时间、相机型号、光圈值、快门速度...
在Android平台上,开发人员经常需要处理图像数据,其中包括读取图片的Exif信息。Exif(Exchangeable Image File Format)是一种扩展的JPEG格式,用于存储与图像相关的信息,如拍摄日期、时间、地理位置、相机型号、...
5. 旋转图片后,更新BufferedImage对象,并将新的图像数据写回文件,同时删除原有的Exif信息,或者更新Orientation字段为正常值(1,表示无旋转)。 6. 最后,可以继续执行其他图片处理任务,如缩放、裁剪等。 以下...
要手动处理EXIF旋转,我们需要先读取图像的EXIF数据,然后根据旋转信息进行相应的矩阵转换。可以使用第三方库如`libexif`或.NET Framework的`System.Drawing`命名空间来读取EXIF数据。以下是一个使用`System.Drawing...
它提供了一系列方法,如`readImage`用于读取图片的EXIF数据,`rotateImage`用于根据`Orientation`属性旋转图片,以及`fixOrientation`函数,它可以自动处理图片的旋转问题。 3. **利用exif.js进行图片校正**: 在...
- `TAG_ORIENTATION`: 图像的方向,用于旋转图片。 - `TAG_ISO_SPEED_RATING`: ISO感光度。 - `TAG_FOCAL_LENGTH`: 焦距。 - `TAG_EXPOSURE_TIME`: 曝光时间。 - `TAG_F_NUMBER`: 光圈值。 4. **读取Exif信息...
旋转图片的速度可能取决于图片的大小和处理算法的效率。为了提供良好的用户体验,可能需要实现异步处理,尤其是在处理大图或资源受限的设备上,防止阻塞用户界面。 5. **旋转算法**: 有两种常见的旋转算法:最近...
如果需要读取图片的EXIF信息,如拍摄日期、相机型号等,可以使用`IIOMetadata`类。 7. **图像处理**: `BufferedImage`类提供了许多方法,如`getRGB()`, `setRGB()`, `createGraphics()`等,可以用来修改图像的颜色...
2. **解析EXIF**:读取EXIF信息的过程通常涉及解析二进制流,找到EXIF数据段,然后根据定义的数据类型解析每个条目的值。例如,日期时间信息可能是字符串类型,而曝光时间可能是浮点数表示的秒数。 3. **关键EXIF...
处理图片数据时,系统可能提供了图像处理功能,比如缩放、裁剪、旋转、滤镜效果等,这通常需要使用到Java的图像处理库,如Java AWT和Java2D,或者第三方库如OpenCV。此外,系统可能还支持图片的元数据读取和编辑,如...
这些类提供了旋转图片的方法,通过指定旋转角度(通常是90度、180度或270度)来实现。旋转过程涉及到图片的矩阵变换,其中心点计算以及尺寸调整是关键步骤。例如,在Android中,可以使用Bitmap.createMatrix()创建一...
有时保存图片时设置了 Exif 旋转(例如:图片保存时旋转 90 度),而不是正确显示此图片,无论谁显示它,都应该在显示之前旋转图片。 因此,如果我在下载图片后(从字节 [] 或将图片保存到设备后)可以访问 Exif ...
手机移动端上传图片压缩完美解决方案 ...完美解决苹果手机拍照上传图片90度旋转问题,EXIF缩减后加入LocalResizeIMG文件,只要两个JS文件引用即可(jquery和LocalResizeIMG) 后台是ASP写的,可以替换成PHP或JAVA
我们可以使用RotationOptions.autoRotate()让Fresco自动根据图片的Exif信息进行旋转,或者使用RotationOptions.atSourceRotation()保留原始的Exif旋转信息。例如: ```java ImageRequest request = ...
Java高级成像(Java Advanced Imaging,简称JAI)是一个用于图像处理和计算机视觉的Java库。JAI库提供了丰富的功能,包括图像的读取、写入、操作和转换,适用于科学、医疗、工程以及多媒体应用等领域。这个压缩包包...
- **图像编辑**:集成基本的图像编辑功能,如裁剪、旋转、滤镜等,可以使用Java的`java.awt.image.BufferedImageOp`接口和相关类。 - **云同步**:通过API与云存储服务(如Google Drive或Dropbox)集成,实现照片的...
在Android系统中,如果手机处于横屏模式拍照,EXIF信息通常会记录这一情况,以便于在查看时自动旋转图片至正确方向。然而,有些情况下,这个信息可能没有被正确地写入或读取,从而导致了照片显示异常。 解决这个...