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# 操作字符串注意事项
下面是常见的一个例子 static void Main(string[] args) { string str = "test"+9; string str2 = "te ...
- SpringMVC教程--Idea中使用Maven创建SpringMVC项目
1.新建项目 参照idea教程中的创建maven项目https://www.cnblogs.com/daxiang2008/p/9061653.html 2.POM中加入依赖包 (1)指定版本 (2) ...
- P4-可编程语言代码学习
(1).behavioral-model 简称bmv2 P4程序首先经过p4c-bm模块编译成JSON格式的配置文件,然后将配置文件载入到bmv2中,转化成能实现交换机功能的数据结构. behavio ...
- Python:List
1.List相关的操作符 操作符 说明 例子 * 重复,将List重复若干遍放到同一个List中 ['hi'] * 3 ['hi' , 'hi' , 'hi'] + 合并两个List(作用和appen ...
- C# Tab键TabIndex使用问题(顺序,不起作用,跳过某个元素等问题)
C#.net语言,winform程序.一个画面中有多个控件,但是在添加的时候顺序是错的,所以现在想改Tab顺序,需要用到TabIndex ,如何设置控件TabIndex 1.选中窗口控件-右键-属性, ...
- transform方法适配页面大小
function setCss() { let App = document.getElementById("app"); // 获取到app节点 最外层的盒子 ...
- 『德不孤』Pytest框架 — 11、Pytest中Fixture装饰器(一)
目录 1.Fixture装饰器的用途 2.Fixture参数说明 3.Fixture装饰器简单应用 4.yield执行后置函数 1.Fixture装饰器的用途 做测试前后的初始化设置,如测试数据准备, ...
- 巧用 CSS 构建渐变彩色二维码
今日,群里有个很有意思的问题,问我如何实现一个彩色的,带渐变的二维码,像是这样: 很有意思的问题,我们在百度谷歌,搜索 qrcode,能搜到非常多在线制作二维码的工具,它们其中一些也会带有制作渐变二维 ...
- 聊聊视频中的编解码器,你所不知道的h264、h265、vp8、vp9和av1编解码库
你知道FFmpeg吗?了解过h264/h265/vp8/vp9编解码库吗? 我们日常生活中使用最广泛的五种视频编码:H264(AVC).H265(HEVC).vp8.vp9.av1都分别是什么?由哪些 ...
- CF1601C题解
赛时一小时,赛后十分钟. 题意:给定一个序列 \(a\) 和一个集合 \(b\),问将 \(b\) 中所有元素插入 \(a\) 后逆序对最少是多少. 观察样例解释,发现 \(b\) 已经被排序过了,于 ...