// 将图片文件转化为字节数组字符串,并对其进行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. 怎样从一个手机上安两个不同版本的软件_一部手机上怎么安装两个不同版本的微信?一部手机安装两个不同版本微信的方法...

    一部手机上怎么安装两个不同版本的微信?一部手机安装两个不同版本微信的方法.很多朋友都不是很清楚,其实方法很简单的,下面小编就为大家介绍一下,一起来看看吧. 1.安卓微信双卡方法:准备工作 从上图我们可 ...

  2. 《屏幕上的聪明决策》:4星。人类在手机/电脑上做选择的心理学研究的综述。不流畅的文本有助于理解和记忆,淘汰赛制可以有效降低选择后懊悔。...

    本书是人类在手机/电脑上做选择的心理学研究的综述,比较可信,有许多有趣的事实与结论.比较重要的结论有这么几个: 1:人类对网站.文章的判断很大程度上以来瞬间感知和审美: 2:不流畅的文本有助于理解和记 ...

  3. JAVA 网络编程(5) SOCKET UDP 单播和组播,以及组播其他机器收不到报文的解决方法

    UDP既可以单播也可以组播 一,单播 单播的过程为 发送方: InetAddress destAddr = InetAddress.getByName("192.168.4.199" ...

  4. w10连接不上网络问题_【问题解决】微软OneNote使用笔记,onenote无法连接网络无法同步解决方法...

    最近使用OneNote又出现了无法同步的问题,找到一个好用的解决方法分享给大家,经常爱国并使用OneNote的朋友可能会遇到这个问题. 插一个我发现的问题,OneNote虽然好用,但导出备份功能貌似不 ...

  5. idea修改java和jsp不起作用_使用IDEA编写jsp时EL表达式不起作用的问题及解决方法...

    在使用IDEA开发maven+springMVC项目时遇到不加载EL表达式的问题,怎么处理呢?下面小编给大家带来了实现代码,一起看看吧 加载如下JSP代码: Title ${lists.usernam ...

  6. 苹果6s为什么连接不上服务器未响应,iPhone6s/6s plus连接iTunes没反应怎么办?苹果手机无法连接iTunes的解决方法...

    当 iPhone 接入电脑以后,在正常情况下是会显示正在安装驱动的信息,如下图所示: 苹果手机无法连接iTunes的解决方法: 情况一:口令锁定/已停用/无反应 1.连接不上itunes的时候,返回到 ...

  7. mac网页java无法加载,chrome浏览器mac版无法加载怎么办_chrome浏览器mac版打不开网页解决方法-win7之家...

    对于使用苹果电脑的用户来说,想要安装chrome浏览器时,就需要选择相应版本的mac版chrome浏览器,然而最近有些用户在使用chrome浏览器mac版时却出现了无法加载,打不开网页的问题,那么ch ...

  8. java提示版本过低怎么处理_eclipse提示jdk版本过低怎么办 eclipse提示jdk版本过低解决方法...

    eclipse提示jdk版本过低怎么办?有时我们会遇到eclipse提示jdk版本过低的情况,下文介绍eclipse提示jdk版本过低解决方法,一起和小乐哥来了解下吧! 170.0000MB / 编程 ...

  9. java 找不到主类或无法加载_Java找不到或无法加载主类解决方法

    1.环境变量设置错误: 2.因为java程序文件有包,所以编译失败. 带包的java程序比普通java程序的编译稍微复杂一些.例如下面的例子: package cn.guopeng;import ja ...

最新文章

  1. 使用Selenium爬虫进阶
  2. Swarm 如何实现 Failover?- 每天5分钟玩转 Docker 容器技术(98)
  3. hector slam matlab,如何使用hector slam算法包
  4. GetWindowRect和GetClientRect(得到窗口坐标)
  5. python中and与or的执行顺序-关联子查询的执行顺序是什么
  6. tcpdump 用法
  7. 第k个数组中的最小值
  8. 拉普拉斯算子属于卷积方法吗_三代图卷积网络理论
  9. 看涨戴尔科技的八大原因
  10. 【真的很先进】阿里云在2018-KVM Forum上分享的动态迁移实践
  11. Response.End方法
  12. Acer 4750 安装黑苹果_10代酷睿手把手安装黑苹果
  13. Chrome下载文件,文件名出现乱码解决
  14. 企业网站开发需要注意什么事项?
  15. 股票预测和股票分析就用FineBI!
  16. echarts4.8.0最新版本下载,亲测可用
  17. QT下获取汉字拼音首字母
  18. 【转】 bio 与块设备驱动
  19. 2022年阿里全球数学竞赛中的集福活动(附代码解答)
  20. 〖Python 数据库开发实战 - MySQL篇⑩〗- MySQL 中不同的数据类型

热门文章

  1. 在java中柱状图代码_我在java中编写了个柱状图,可运行了,我想让柱状图在JSP页面中显示,请问有什么方法么?谢谢。...
  2. 收藏夹库计算机网络的关系,云南省计算机一级考试题库 计算机网络及基础.pdf...
  3. B. Trouble Sort Codeforces Round #648 (Div. 2)
  4. 【Excel】提取身份证信息
  5. java 自定义注解_Java注解
  6. java 读取图片给 matlab_如何将MATLAB图像处理程序转换为java?
  7. halcon旋转后坐标_FPGA大赛【八】具体模块设计图像旋转方案
  8. django批量修改table_django-formset实现数据表的批量操作
  9. Failed to instantiate file__from module__The specified list does
  10. 第十四节: EF的三种模式(四) 之 原生正宗的 CodeFirst模式的默认约定