java图片上传被旋转,在其他大牛那看到的java手机图片上传旋转问题的解决方法...
// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
//Base64所用包:org.apache.commons.codec.binary.Base64
public static String encodeImgageToBase64(File imageFile) {
byte[] data = null;
// 读取图片字节数组
try {
InputStream in = new FileInputStream(imageFile);
data = new byte[in.available()];
in.read(data);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
// 对字节数组Base64编码
return Base64.encodeBase64String(data);// 返回Base64编码过的字节数组字符串
}
判断是否旋转:
/**
*
* @功能:解析base64图片编码,判断是否有旋转
* @param imgStr base64图片编码
* @param format 图片格式
* @param fileName 图片名称
*/
public static Map stringToImage(String imgStr, String format, String fileName){
//解码base64图片
byte[] bts = Base64.decodeBase64(imgStr);
InputStream is = new ByteArrayInputStream(bts);
try {
//获取照片的Exif信息
Metadata metadata = JpegMetadataReader.readMetadata(is);
Directory exif = metadata.getFirstDirectoryOfType(ExifDirectoryBase.class);
/*
//输出从图片获取到的相关信息
Iterable ites = metadata.getDirectories();
for (Directory directory : ites) {
Iterator tags = directory.getTags().iterator();
while(tags.hasNext()){
Tag tag = (Tag) tags.next();
System.out.println(tag);
}
}
*/
//获取照片拍摄方向
String type = exif.getString(ExifDirectoryBase.TAG_ORIENTATION);
//图片正常情况下,type=1,测试正常图片旋转,请修改case 条件为 1
if(StringUtil.notBlank(type)){//判断拍摄方向是否为空
switch (Integer.parseInt(type)) {
case 3://要进行180度旋转
byte[] bytes = rotateImg(bts , 180.0 , format);
return uploadToAliYunOSS(fileName, bytes);
case 6://要进行90度旋转
byte[] bytes1 = rotateImg(bts , 90.0 , format);
return uploadToAliYunOSS(fileName, bytes1);
case 8://要进行-90度旋转
byte[] bytes2 = rotateImg(bts , -90.0 , format);
return uploadToAliYunOSS(fileName, bytes2);
default :
return uploadToAliYunOSSBybase64(fileName, bts);
}
}else{
return uploadToAliYunOSSBybase64(fileName, bts);
}
} catch (Exception e) {
e.printStackTrace();
}
return Tool.getError(1, "请求错误!", "");
}
矫正图片旋转
/**
*
* @功能:矫正图片旋转,返回byte[]
* @param input
* @param angle
* @param format
* @param fileName
* @throws IOException void
*/
public static byte[] rotateImg(byte[] bytes , double angle , String format) throws IOException{
InputStream input = new ByteArrayInputStream(bytes);
BufferedImage old_img = ImageIO.read(input);
int width = old_img.getWidth();
int height = old_img.getHeight();
double[][] newPositions = new double[4][];
newPositions[0] = calculatePosition(0, 0, angle);
newPositions[1] = calculatePosition(width, 0, angle);
newPositions[2] = calculatePosition(0, height, angle);
newPositions[3] = calculatePosition(width, height, angle);
double minX = Math.min(
Math.min(newPositions[0][0], newPositions[1][0]),
Math.min(newPositions[2][0], newPositions[3][0])
);
double maxX = Math.max(
Math.max(newPositions[0][0], newPositions[1][0]),
Math.max(newPositions[2][0], newPositions[3][0])
);
double minY = Math.min(
Math.min(newPositions[0][1], newPositions[1][1]),
Math.min(newPositions[2][1], newPositions[3][1])
);
double maxY = Math.max(
Math.max(newPositions[0][1], newPositions[1][1]),
Math.max(newPositions[2][1], newPositions[3][1])
);
int newWidth = (int)Math.round(maxX - minX);
int newHeight = (int)Math.round(maxY - minY);
BufferedImage new_img = new BufferedImageBuilder(newWidth, newHeight , BufferedImage.TYPE_INT_BGR).build();
Graphics2D g = new_img.createGraphics();
g.setRenderingHint(
RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR
);
g.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON
);
double w = newWidth / 2.0;
double h = newHeight / 2.0;
g.rotate(Math.toRadians(angle), w, h);
int centerX = (int)Math.round((newWidth - width) / 2.0);
int centerY = (int)Math.round((newHeight - height) / 2.0);
g.drawImage(old_img, centerX, centerY, null);
g.dispose();
//新建流。
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//利用ImageIO类的write方法,将BufferedImage以png图片的数据模式写入流。
ImageIO.write(new_img, format, baos);
return baos.toByteArray();
}
rotateImg() 中的calculatePosition()方法
private static double[] calculatePosition(double x, double y, double angle){
angle = Math.toRadians(angle);
double nx = (Math.cos(angle) * x) - (Math.sin(angle) * y);
double ny = (Math.sin(angle) * x) + (Math.cos(angle) * y);
return new double[] {nx, ny};
}
本文中的方法出处:http://my.oschina.net/u/2344340/blog/699435
java图片上传被旋转,在其他大牛那看到的java手机图片上传旋转问题的解决方法...相关推荐
- 怎样从一个手机上安两个不同版本的软件_一部手机上怎么安装两个不同版本的微信?一部手机安装两个不同版本微信的方法...
一部手机上怎么安装两个不同版本的微信?一部手机安装两个不同版本微信的方法.很多朋友都不是很清楚,其实方法很简单的,下面小编就为大家介绍一下,一起来看看吧. 1.安卓微信双卡方法:准备工作 从上图我们可 ...
- 《屏幕上的聪明决策》:4星。人类在手机/电脑上做选择的心理学研究的综述。不流畅的文本有助于理解和记忆,淘汰赛制可以有效降低选择后懊悔。...
本书是人类在手机/电脑上做选择的心理学研究的综述,比较可信,有许多有趣的事实与结论.比较重要的结论有这么几个: 1:人类对网站.文章的判断很大程度上以来瞬间感知和审美: 2:不流畅的文本有助于理解和记 ...
- JAVA 网络编程(5) SOCKET UDP 单播和组播,以及组播其他机器收不到报文的解决方法
UDP既可以单播也可以组播 一,单播 单播的过程为 发送方: InetAddress destAddr = InetAddress.getByName("192.168.4.199" ...
- w10连接不上网络问题_【问题解决】微软OneNote使用笔记,onenote无法连接网络无法同步解决方法...
最近使用OneNote又出现了无法同步的问题,找到一个好用的解决方法分享给大家,经常爱国并使用OneNote的朋友可能会遇到这个问题. 插一个我发现的问题,OneNote虽然好用,但导出备份功能貌似不 ...
- idea修改java和jsp不起作用_使用IDEA编写jsp时EL表达式不起作用的问题及解决方法...
在使用IDEA开发maven+springMVC项目时遇到不加载EL表达式的问题,怎么处理呢?下面小编给大家带来了实现代码,一起看看吧 加载如下JSP代码: Title ${lists.usernam ...
- 苹果6s为什么连接不上服务器未响应,iPhone6s/6s plus连接iTunes没反应怎么办?苹果手机无法连接iTunes的解决方法...
当 iPhone 接入电脑以后,在正常情况下是会显示正在安装驱动的信息,如下图所示: 苹果手机无法连接iTunes的解决方法: 情况一:口令锁定/已停用/无反应 1.连接不上itunes的时候,返回到 ...
- mac网页java无法加载,chrome浏览器mac版无法加载怎么办_chrome浏览器mac版打不开网页解决方法-win7之家...
对于使用苹果电脑的用户来说,想要安装chrome浏览器时,就需要选择相应版本的mac版chrome浏览器,然而最近有些用户在使用chrome浏览器mac版时却出现了无法加载,打不开网页的问题,那么ch ...
- java提示版本过低怎么处理_eclipse提示jdk版本过低怎么办 eclipse提示jdk版本过低解决方法...
eclipse提示jdk版本过低怎么办?有时我们会遇到eclipse提示jdk版本过低的情况,下文介绍eclipse提示jdk版本过低解决方法,一起和小乐哥来了解下吧! 170.0000MB / 编程 ...
- java 找不到主类或无法加载_Java找不到或无法加载主类解决方法
1.环境变量设置错误: 2.因为java程序文件有包,所以编译失败. 带包的java程序比普通java程序的编译稍微复杂一些.例如下面的例子: package cn.guopeng;import ja ...
最新文章
- 使用Selenium爬虫进阶
- Swarm 如何实现 Failover?- 每天5分钟玩转 Docker 容器技术(98)
- hector slam matlab,如何使用hector slam算法包
- GetWindowRect和GetClientRect(得到窗口坐标)
- python中and与or的执行顺序-关联子查询的执行顺序是什么
- tcpdump 用法
- 第k个数组中的最小值
- 拉普拉斯算子属于卷积方法吗_三代图卷积网络理论
- 看涨戴尔科技的八大原因
- 【真的很先进】阿里云在2018-KVM Forum上分享的动态迁移实践
- Response.End方法
- Acer 4750 安装黑苹果_10代酷睿手把手安装黑苹果
- Chrome下载文件,文件名出现乱码解决
- 企业网站开发需要注意什么事项?
- 股票预测和股票分析就用FineBI!
- echarts4.8.0最新版本下载,亲测可用
- QT下获取汉字拼音首字母
- 【转】 bio 与块设备驱动
- 2022年阿里全球数学竞赛中的集福活动(附代码解答)
- 〖Python 数据库开发实战 - MySQL篇⑩〗- MySQL 中不同的数据类型
热门文章
- 在java中柱状图代码_我在java中编写了个柱状图,可运行了,我想让柱状图在JSP页面中显示,请问有什么方法么?谢谢。...
- 收藏夹库计算机网络的关系,云南省计算机一级考试题库 计算机网络及基础.pdf...
- B. Trouble Sort Codeforces Round #648 (Div. 2)
- 【Excel】提取身份证信息
- java 自定义注解_Java注解
- java 读取图片给 matlab_如何将MATLAB图像处理程序转换为java?
- halcon旋转后坐标_FPGA大赛【八】具体模块设计图像旋转方案
- django批量修改table_django-formset实现数据表的批量操作
- Failed to instantiate file__from module__The specified list does
- 第十四节: EF的三种模式(四) 之 原生正宗的 CodeFirst模式的默认约定