java后台解决上传图片翻转90的问题,有demo,经过测试可用
1.需要加入 依赖
metadata-extractor.jar
依赖如下
<dependencies>
<!-- Extracts Exif, IPTC, XMP, ICC and other metadata from image and video files(从图像和视频文件中提取EXIF、IPTC、XMP、ICC和其他元数据) -->
<dependency>
<groupId>com.drewnoakes</groupId>
<artifactId>metadata-extractor</artifactId>
<version>2.11.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2.主要看工具类,ImageUtil,因为是mvc上传图片,所以之前参数我参考别人代码 改了一下.
package com.huarui.util;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import javax.imageio.ImageIO;
import com.drew.imaging.ImageMetadataReader;
import com.drew.imaging.ImageProcessingException;
import com.drew.metadata.Directory;
import com.drew.metadata.Metadata;
import com.drew.metadata.Tag;
public class ImageUtil {
public static Map<String, Object> getExif(InputStream inputStream) {
Map<String, Object> map = new HashMap<String, Object>();
try {
Metadata metadata = ImageMetadataReader.readMetadata(inputStream);
map = printExif(metadata);
} catch (ImageProcessingException e) {
System.out.println(e.getMessage());
} catch (IOException e) {
System.out.println(e.getMessage());
}
return map;
}
// 获取exif信息,将旋转角度信息拿到
private static Map<String, Object> printExif(Metadata metadata) {
Map<String, Object> map = new HashMap<String, Object>();
String tagName = null;
String desc = null;
for (Directory directory : metadata.getDirectories()) {
for (Tag tag : directory.getTags()) {
tagName = tag.getTagName();
desc = tag.getDescription();
if (tagName.equals("Orientation")) {
map.put("Orientation", desc);
}
}
}
return map;
}
public static int getAngle(Map<String, Object> map) {
int ro = 0;
if(map.get("Orientation")!=null) {
String ori = map.get("Orientation").toString();
if (ori.indexOf("90") >= 0) {
ro = 1;
} else if (ori.indexOf("180") >= 0) {
ro = 2;
} else if (ori.indexOf("270") >= 0) {
ro = 3;
}
}
return ro;
}
public static BufferedImage getBufferedImg(BufferedImage src,int width, int height, int ro) {
int angle = (int) (90 * ro);
int type = src.getColorModel().getTransparency();
int wid = width;
int hei = height;
if (ro % 2 != 0) {
int temp = width;
width = height;
height = temp;
}
Rectangle re = new Rectangle(new Dimension(width, height));
BufferedImage BfImg = null;
BfImg = new BufferedImage(re.width, re.height, type);
Graphics2D g2 = BfImg.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2.rotate(Math.toRadians(angle), re.width / 2,re.height / 2);
g2.drawImage(src, (re.width - wid) / 2, (re.height - hei) / 2, null);
g2.dispose();
return BfImg;
}
//获得图片的高
public static int getHeight(InputStream is) {
BufferedImage src = null;
int height = -1;
try {
src = ImageIO.read(is);
height = src.getHeight();
} catch (Exception e) {
System.out.println(e.getMessage());
}
return height;
}
//获得图片的宽
public static int getWidth(InputStream is) {
BufferedImage src = null;
int width = -1;
try {
src = ImageIO.read(is);
width = src.getWidth();
} catch (Exception e) {
System.out.println(e.getMessage());
}
return width;
}
}
3.Ctroller
package com.huarui.action;
import com.huarui.util.ImageUtil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
@Controller
public class UploadController {
@RequestMapping("/upload")
public @ResponseBody String fileUpload(MultipartFile file) throws IOException {
File localFile = new File("e://a.jpg");
String ex = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
//图片翻转90
int angle = ImageUtil.getAngle(ImageUtil.getExif(file.getInputStream()));
BufferedImage bf =ImageUtil.getBufferedImg(ImageIO.read(file.getInputStream()), ImageUtil.getWidth(file.getInputStream()), ImageUtil.getHeight(file.getInputStream()), angle);
ImageIO.write(bf, ex.substring(1), localFile);
//度问题
return localFile.getAbsolutePath();
}
@RequestMapping("/")
public String index(){
return "test";
}
}
参考代码->https://blog.csdn.net/sum__mer/article/details/50847584
亲测有效,附上链接->
https://github.com/youxiu326/sb_image_extractor.git
java后台解决上传图片翻转90的问题,有demo,经过测试可用的更多相关文章
- Java后台解决跨域问题
首先说一下什么是跨域? JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.那什么是跨域呢,简单地理解就是因为JavaScript同源策略的限制,a.com域名下的js无法操作b.c ...
- form表单提交中文乱码(前台中文到JAVA后台乱码)问题及解决
form表单提交中文乱码(前台中文到JAVA后台乱码)问题及解决 一.问题: 页面输入框中的中文内容,在后台乱码,导致搜索功能失效:(详细可以见后面的重现) 二.原因: 浏览器对于数据的默认编码格式为 ...
- Base64 JAVA后台编码与JS前台解码(解决中文乱码问题)
中文通过Java后台进行Base64编码后传到前台,通过JS进行Base64解码时会出现中文乱码的问题,被这个问题也是困扰了几天,使用jquery.base64.js只能转码非中文字符,经过搜集各种方 ...
- 解决Jsp与Java后台之间url传值中文乱码问题
JSP页面中,由JavaScript拼接url时,对于中文名称变量应该加上encodeURIComponent方法,对中文进行十六进制编码. 例如: url = /com/xxx/B.jsp?chin ...
- 极光推送-Java后台实现方式一:Http API
Java后台实现极光推送有两种方式,一种是使用极光推送官方提供的推送请求API:https://api.jpush.cn/v3/push,另一种则是使用官方提供的第三方Java APIjar包,这里先 ...
- 极光推送经验之谈-Java后台服务器实现极光推送的两种实现方式
原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6439313.html Java后台实现极光推送有两种方式,一种是使用极光推送官方提供的推送请 ...
- java后台异步任务执行器TaskManager
java后台异步任务执行器TaskManager 此方式基于MVC方式: 一,使用任务: @Resource private TaskManager taskManager; public strin ...
- Java后台工程师面试杂记——不跳不涨工资星人跳槽经历
经过接近一个月的时间,完成换工作这件“小事”,前后总计面试了多家公司,最后也没接到几个offer,不过最终总算尘埃落定,就对这个过程进行一个总结吧. 在某互联网公司工作了近一年的时间,但是频繁的业务需 ...
- 如何用CropBox实现头像裁剪并与java后台交互
如何用CropBox实现头像裁剪并与java后台交互 参考网站:https://developer.mozilla.org/zh-CN/docs/Web/API/Blob 参考: http://blo ...
随机推荐
- 【C# 异常处理】StackTrace 堆栈跟踪
作用 在使用.NET编写的代码在debug时很容易进行排查和定位问题,一旦项目上线并出现问题的话那么只能依靠系统日志来进行问题排查和定位,但当项目复杂时,即各种方法间相互调用将导致要获取具体的出错方法 ...
- 【C# TAP 异步编程】二 、await运算符已经可等待类型Awaitable
await的作用: 1.await是一个标记,告诉编译器生成一个等待器来等待可等待类型实例的运行结果. 2.一个await对应一个等待器 ,任务的等待器类型是TaskAwaiter/TaskAwait ...
- 构造方法及方法(重载)与this关键字的使用
一:构造方法的概念: 构造方法是一种特殊的方法,它是一个与类同名的方法.对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化.当类实例化一个对象时会自动调用构造方法. ...
- Tableau学习Step2一数据文件的读取与统计图、表的概述
Tableau学习Step2一数据文件的读取与统计图.表的概述 本文首发于博客冰山一树Sankey,去博客浏览效果更好. 一. 前言 本教程通过一个案例从浅到深来学习Tableau知识 案例概述: 二 ...
- Redis常用命令代码实例集合
//连接本地的 Redis 服务 $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $redis->auth('12345 ...
- Linux下面怎么安装PHP扩展?
一般开发环境都是在windows上, 安装扩展也很容易, 直接把下载的.dll文件扔到ext下面, 改一下php.ini文件. 完事了. linux上有两种安装方法 1.编译安装 //下载文件 #wg ...
- 12、mysql的事务日志
mysql的事务日志 事务有4种特性:原子性.一致性.隔离性和持久性.那么事务的四种特性到底是基于什么机制实现呢? 事务的隔离性由锁机制实现. 事务的原子性.一致性和持久性由事务的redo日志和und ...
- 你真的懂TSP吗
整数规划-模型 2022年2月26日 TSP问题 有一个邮递员,他每天负责向100个客户的家门口送一份报纸,他希望走最短的总路程来完成配送任务,这是TSP问题最原始的场景.用理论描述就是:找一个路径 ...
- LGP2490题解
有点儿神秘? 根据他这个题意说的,白子向右的第一个一定是对应的黑子啊. 所以棋子的绝对位置是不重要的,我们只需要考虑白子和黑子的相对位置,然后考虑用 GF 来拼凑状态就好了. 下面的 \(k\) 是题 ...
- QQ密码防盗5招
第一招:复制粘贴防木马 每次登录QQ前,新建一个文本文件,并键入密码后复制,关闭文本文件后(不要保存)打开QQ,用"Ctrl+V"把密码粘贴到密码栏里,这样可以防范绝大部分的QQ木 ...