文档章节

ios图片上传翻转问题解决

lvxingjob
 lvxingjob
发布于 2016/05/22 23:29
字数 608
阅读 94
收藏 5

 

开发微信服务,有个上传头像的功能,前端用html5的方法来上传头像

<img id="babyHead" src="$session.getAttribute('picUrl')" style="width:74px;height:74px;border-radius:37px;"/>
<label class="camera"><i class="fa fa-camera" aria-hidden="true"></i>
<input id="f1" name="f1" class="weui_uploader_input" type="file" capture="camera" accept="image/*" multiple="">
						
.on("change", "#f1", function () {
		$("#loadingToast").show()
        var fileName = $(this).val();
        if (fileName.length > -1) {
        	jQuery.ajaxFileUpload({
  			  url:jQuery("#confirmUrl").val(),
  			  type: 'post',
  			  secureuri:false,
  			  fileElementId:'f1',
  			  data:{
  			  type:'5'},
  			  dataType:"json",
  			  success: function(data, status){ 
  				  $('#babyHead').attr('src',data.url);
  				$('#headUrl').val(data.url);
  				$("#loadingToast").hide();
              },error:function(data,status,e){
  				alert(e);
  			}
  		});
        } else {
            alert("请选择图片上传!");
        }
    });

上传到后端的头像竟然会出现各种翻转,基本就是90度的倍数。

查找后得知是ios的拍照片时记录了拍摄的翻转角度。为了把这个角度纠正过来,在java中需要调用metadata-extractor

maven引用如下

<dependency>
		<groupId>com.drewnoakes</groupId>
		<artifactId>metadata-extractor</artifactId>
		<version>2.9.1</version>
	</dependency>

网上很多引用2.3.1的做法,实际上已经不能用了,在2.9.1中原先老的ExifDirector变成了n个directory,我通过for循环挨个试出来,当ExifDirector为ExifIFD0Directory时,才可以调用ExifDirectoryBase.TAG_ORIENTATION来判断翻转的角度,具体方法如下面的代码,我的思路是得到翻转的数值:6,3,8来得到需要右转的角度:90,180,270,然后调用Graphics2D的rotate方法来翻转

1.得到角度

private int getRotateAngleForPhoto(String filePath) {
		int angle = 0;
		File imgFile = new File(filePath);
		try {
			Metadata metadata = ImageMetadataReader.readMetadata(imgFile);
			for (Directory directory : metadata.getDirectories()) {
				if ("ExifIFD0Directory".equalsIgnoreCase(directory.getClass()
						.getSimpleName())) {
					if (directory
							.containsTag(ExifDirectoryBase.TAG_ORIENTATION)) {
						// Exif信息中方向  
						int orientation = directory
								.getInt(ExifDirectoryBase.TAG_ORIENTATION);
						logger.info("orientation=" + orientation);
						switch (orientation) {
						case 6:
							angle = 90;
							break;
						case 3:
							angle = 180;
							break;
						case 8:
							angle = 270;
							break;
						default:
							return 0;
						}

					}
				}

			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return angle;
	}

2.调用的翻转方法

import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Transparency;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
	 * 向右旋转angle角度
	 * @param img
	 * @param angle
	 * @return
	 */
	public static void rotate(File image, int angle,String targetFolderPath,String targetFileName) throws IOException {
		BufferedImage img = ImageIO.read(image);
		int w = img.getWidth();
		int h = img.getHeight();
		BufferedImage dimg = new BufferedImage(w, h, img.getType());
		Graphics2D g = dimg.createGraphics();
		g.rotate(Math.toRadians(angle), w / 2, h / 2);
		g.drawImage(img, null, 0, 0);
		commonIoWrite(targetFolderPath, targetFileName, dimg, g);
	}

 

3.根据翻转的角度来调用对应的rotate方法

int angle = getRotateAngleForPhoto(sourcePath);
if (getRotateAngleForPhoto(sourcePath) > 0) {
	ImageUtil.rotate(new File(smallPath),angle, path, smallFileName);
}

其中smallPath是源文件地址,angle是向右翻转角度,path是目标文件夹,smallFileName是最终的文件名
                        

 

© 著作权归作者所有

lvxingjob

lvxingjob

粉丝 2
博文 18
码字总数 912
作品 0
杭州
高级程序员
私信 提问
驰骋工作流引擎-CCMobile与安卓、IOS集成过程中的问题与解决方案

CCMobile与安卓、IOS集成过程中的问题与解决方案 前言: CCMobile(2019版本)是CCFlow&JFlow 的一款移动端审批的产品。系统基于mui框架开发,是一款可以兼容Android与IOS的移动端工作流审批...

孟娟
06/26
76
0
迈绝伦团队工作汇总

项目负责人:余志恒 up_java后台:无 mz_java后台:修改同城下载文件名,完善论坛功能 bwk后台:无 项目负责人:季景胜 up_Android:无 upzg_Android:无 mzqk_Android:登陆界面重写,地图选...

风化的骆驼
2017/01/16
2
0
PHP POST接收处理 IOS上传NSData图片数据,上传图片到服务器

【IOS 接收PHP 图片】 1,PHP将图片的URL直接返回给IOS端即可,IOS获取到URL处理,下载缓存就可以在APP端使用了。 【IOS上传图片PHP接收】 1、IOS上传图片可能有很多方法,今天作者我用了这种...

RablePHP
2014/11/28
8.6K
3
iOS股票K线图、校园助手、适配iPhone X、版本检测等源码

iOS精选源码 快速创建menuItem控件 YHPhotoBrowser 优化的网络图片浏览 cocoaAsynSocket demo (包含客户端和服务端) SwipeMenuViewController现在支持iPhoneX和Swift4。 仿微信的提醒对话框 ...

sunnyaigd
2017/10/31
66
0
迈绝伦团队工作汇总

项目负责人:余志恒 up_java后台:暂无更新 mz_java后台:解决了建材店的建材商品在成交后不能增加成交量问题,修改获取抢单交易信息接口,秒装新闻功能补充 bwk后台:暂无更新 项目负责人:...

风化的骆驼
2016/12/02
3
0

没有更多内容

加载失败,请刷新页面

加载更多

32位与64位Linux系统下各类型长度对比

64 位的优点:64 位的应用程序可以直接访问 4EB 的内存和文件大小最大达到4 EB(2 的 63 次幂);可以访问大型数据库。本文介绍的是64位下C语言开发程序注意事项。 1. 32 位和 64 位C数据类型...

mskk
16分钟前
4
0
Vue 实现点击空白处隐藏某节点(三种方式:指令、普通、遮罩)

在项目中往往会有这样的需求: 弹出框(或Popover)在 show 后,点击空白处可以将其 hide。 针对此需求,整理了三种实现方式,大家按实际情况选择。 当然,我们做项目肯定会用到 UI 框架,常...

张兴华ZHero
23分钟前
5
0
SpringBoot激活profiles你知道几种方式?

多环境是最常见的配置隔离方式之一,可以根据不同的运行环境提供不同的配置信息来应对不同的业务场景,在SpringBoot内支持了多种配置隔离的方式,可以激活单个或者多个配置文件。 激活Profi...

恒宇少年
24分钟前
6
0
PDF修改文字的方法有哪些?怎么修改PDF文件中的文字

PDF修改文字一直以来都是一个难以解决的问题,很多的办公族在办公的时候会有修改PDF文件中的文字的需要,可是PDF文件一般是不能进行编辑和修改的,难道就没有什么办法解决这个问题了嘛?不要...

趣味办公社
27分钟前
3
0
企业组织中采用服务网格的挑战

作者:Christian Posta 译者:罗广明 原文:https://blog.christianposta.com/challenges-of-adopting-service-mesh-in-enterprise-organizations/ 编者按 本文作者介绍了企业组织采用服务网...

jimmysong
37分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部