关于什么是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)); } }
相关推荐
有时保存图片时设置了 Exif 旋转(例如:图片保存时旋转 90 度),而不是正确显示此图片,无论谁显示它,都应该在显示之前旋转图片。 因此,如果我在下载图片后(从字节 [] 或将图片保存到设备后)可以访问 Exif ...
手机移动端上传图片压缩完美解决方案 ...完美解决苹果手机拍照上传图片90度旋转问题,EXIF缩减后加入LocalResizeIMG文件,只要两个JS文件引用即可(jquery和LocalResizeIMG) 后台是ASP写的,可以替换成PHP或JAVA
12、图片旋转功能:适用于图片调整。 13、可另外安装专属于Phoca主题。 14、具备EXIF显示功能,让观赏者更容易了解图片拍摄时的设定。 15、支持地理定位(Geotagging)功能,拍摄位置一目了然。 16、支持Youtube影片,...
下载示例应用演示版产品特点图像显示显示来自资产,资源,文件系统或位图的图像根据EXIF自动旋转文件系统(例如相机或画廊)中的图像以90°增量手动旋转图像显示源图像的区域加载大图像时使用预览图像在运行时交换...
Camera2Vision 该示例将使您使用Camera1 API和... 您将必须读取图片中嵌入的EXIF数据,以获取旋转信息并使用Matrix手动翻转。测验经过测试并致力于: LG Nexus 5(API等级:23) 三星Galaxy S4(API级别:22) 三星Gal
你必须: 开始活动(带有适当的附加功能),选择图片使用一些奇怪的规则来分析活动结果,加载位图/ EXIF并相应地对其进行旋转开始种植活动解析活动结果以获得最终位图这不是超级难,但肯定会花费比您想要花费的时间...
4.24 动态旋转图片 4.25 猜猜我在想什么 4.26 离开与关闭程序的弹出窗口 4.27 隐藏式抽屉 4.28 手机桌面上的小玩意 4.29 手机图片搜索管理器 4.30 实时配置桌面上的AppWidget UI Layout 4.31 识别输入装置ID与Input...
4.24 动态旋转图片 4.25 猜猜我在想什么 4.26 离开与关闭程序的弹出窗口 4.27 隐藏式抽屉 4.28 手机桌面上的小玩意 4.29 手机图片搜索管理器 4.30 实时配置桌面上的AppWidget UI Layout 4.31 识别输入装置ID与Input...
4.24 动态旋转图片 4.25 猜猜我在想什么 4.26 离开与关闭程序的弹出窗口 4.27 隐藏式抽屉 4.28 手机桌面上的小玩意 4.29 手机图片搜索管理器 4.30 实时配置桌面上的AppWidget UI Layout 4.31 识别输入装置ID与Input...
4.24 动态旋转图片 4.25 猜猜我在想什么 4.26 离开与关闭程序的弹出窗口 4.27 隐藏式抽屉 4.28 手机桌面上的小玩意 4.29 手机图片搜索管理器 4.30 实时配置桌面上的AppWidget UI Layout 4.31 识别输入装置ID与Input...