iOS和小米手机拍照上传后,在web端显示旋转
( ′◔ ‸◔`)现在的公司啊都流行混合开发,我们公司也不例外,非要把交互非常多的社区模块用内嵌web页展示,好吧好吧,毕竟有的应用也是这么做的,那既然是社区就肯定少不了用户上传图片的操作,在开发阶段没有发现任何问题,也是很奇怪,等到了测试阶段,发现部分机型和IOS机型拍照之后,web页获取路径之后展示的图片和图片文件全不是正确的方向,旋转了90°、180°的都有,于是去网上查找原因,结果就是……
大于2M的图片!并且是竖拍的图片!在生成照片的时候图片的Orientation属性会被重写!!!!所以部分机型和IOS 都会出现旋转的问题!
可恶!
当然方法也百度到了,只不过大部分都是只放了代码,并没有讲解,其实理解了也非常简单。
一、安装插件 ︶︿︶
解决这个问题首先是要借助插件的,因为我们前端旋转了图片只是在页面上看上去旋转了,并没有解决根本问题,于是就要用到 exif.js这个工具。
https://www.npmjs.com/package/exif-js
一个强大的读取图片数据的工具,安装也很简单文档里也有,就不多说了,因为我使用的是Vue,所以之间npm安装后在需要使用的页面引入:
import exif from "exif-js";
到这里就算完成了插件的全部安装;
二、开工!(^-^)V
首先在选择框的change事件中我们直接调用exif的方法;
let Orientation = 0;
exif.getData(e.target.files[0], function() {
exif.getAllTags(this);
Orientation = exif.getTag(this, 'Orientation');
});
//e.target.files[0]为获取的第一个图片文件,如果是多个图片文件可进行遍历
这时候我们就已经获取到图片的Orientation属性了,这个属性就是图片的方向属性,不同的值代表不同的方向:
| 图片正常 | 1 |
| 图片朝右 | 6 |
| 图片朝左 | 8 |
| 图片倒置 | 3 |
后来经过测试Orientation还会有一个值,就是0,当Orientation等于0的时候图片是正常的,但0代表的意思,还没有找到。
那么现在就可以对图片进行处理了let canvas = document.createElement("canvas");
let ctx = canvas.getContext("2d");
let width = img.width;
let height = img.height;
switch(orientation) {
case 0:
//不做任何处理直接画图
canvas.width = width;
canvas.height = height;
ctx.drawImage(img, 0, 0)
break;
case 1:
//不做任何处理直接画图
canvas.width = width;
canvas.height = height;
ctx.drawImage(img, 0, 0)
break;
case 6:
//图片顺时针旋转90°
canvas.height = width;
canvas.width = height;
ctx.rotate(Math.PI / 2);
ctx.translate(0, -height);
ctx.drawImage(img, 0, 0)
break;
case 3:
//图片旋转180°
canvas.height = height;
canvas.width = width;
ctx.rotate(Math.PI);
ctx.translate(-width, -height);
ctx.drawImage(img, 0, 0)
break;
case 8:
//图片逆时针旋转90°
canvas.height = width;
canvas.width = height;
ctx.rotate(-Math.PI / 2);
ctx.translate(-height, 0);
ctx.drawImage(img, 0, 0)
break;
case undefined:
//不作任何处理直接画图
canvas.width = width;
canvas.height = height;
ctx.drawImage(img, 0, 0)
break;
}
let ndata=canvas.toDataURL("image/jpeg", 1);
这里图片的处理就是把图片原原本本的在canvas上画一遍,然后把它转成正确的方向就可以了,那么缩略图就可以直接展示ndata就可以了。
但是这里还只是一张图片,我们不可能给后台传图片base64码过去,必须是图片文件才可以,那么这里就要用到base64的转码。
首先是base64转码函数的封装:
// base64转成bolb对象
dataURItoBlob(base64Data) {
let byteString;
if(base64Data.split(",")[0].indexOf("base64") >= 0)
byteString = atob(base64Data.split(",")[1]);
else byteString = unescape(base64Data.split(",")[1]);
let mimeString = base64Data
.split(",")[0]
.split(":")[1]
.split(";")[0];
let ia = new Uint8Array(byteString.length);
for(let i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i);
}
return new Blob([ia], {
type: mimeString
});
},
然后将上面我们转换好的ndata通过base64转换成图片文件就可以了。
//调用转换函数将base64码转换成图片文件
let blob = this.dataURItoBlob(ndata);
//将新文件名与原图片文件保持一致
blob.name = e.target.files[0].name;
//将新文件放到我们需要传给后台的文件数组里
this.files.push(blob);
三、结束o(゚Д゚)っ
以上就是对图片旋转做的处理,很简单,我们就可以理解为图片的重绘。当然上面的方法只是单个图片的转换,如果用户同时上传了多个图片,那么就在对应的地方添加遍历循环就可以了。
如果有不足的地方希望大家补充,有不对的地方也请大家批评指正。
如果还不太明白也可以通过我的联系方式进行讨论。
iOS和小米手机拍照上传后,在web端显示旋转的更多相关文章
- iOS拍照上传后,在web端显示旋转 Swift+OC版解决方案
问题描述: 手机头像上传,遇到一个怪现象,就是拍照上传时,手机端显示头像正常,但在web端查看会有一个左旋90度的问题. 并且照片竖怕才会有此问题,横拍不存在. 原因分析: 手机拍照时,用相机拍摄出来 ...
- php实现手机拍照上传头像功能
现在手机拍照很火,那么如何使用手机拍照并上传头像呢?原因很简单,就是数据传递,首先手机传递照片信息,这个就不是post传递 也不是get函数传递, 这个另外一种数据格式传递,使用的是$GLOBALS ...
- ios端浏览器拍照上传到服务器,图片被旋转90度 php 解决方案
1.可以通过前端进行解决,本案例通过后端解决的 判断请求的浏览器的ua,如果是ios浏览器则进行90度旋转 重点来了: 必须确保检测的图片是ios设备上传的完整图片,不要在前端压缩过的,因为压缩后的图 ...
- java Web开发实现手机拍照上传到服务器
第一步: 搭环境,基本jdk 1.6+apache tomcat6.0+myeclipse2014 1.我们要清楚自己的jdk版本.因为我们Apache Tomcat配置的成功的前提是版本相对应. 安 ...
- php实现视频拍照上传头像功能实例代码
如果要在php中实现视频拍照我们需要借助于flash插件了,由flash拍出的确照片我们再通过php的$GLOBALS ['HTTP_RAW_POST_DATA']接受数据,然后保存成图片就可以了,下 ...
- html5调用手机摄像头,实现拍照上传功能
今天做手机网站,想实现手机扫描二维码功能.首先实现在浏览器中调用手机摄像头,实现拍照功能并且把拍下的照片显示在页面并上传到服务器上,然后再在服务器端进行分析. 首先实现在浏览器中调用摄像头,当然用现在 ...
- iOS图片上传后被旋转的问题
最近用PHP做了一个图片合成程序,前端是通过HTML的file input选取自定图片,POST到php后台调整尺寸后与事先准备好的背景图进行合成. 通过测试发现,上传后的自定图片有的被旋转了,有的是 ...
- 【Demo】HTML5 拍照上传
本文主要讲解 手机浏览器 如何拍照 为什么会有这个需求 最近做一个项目要用到拍照然后上传照片,但是网页拍照一般都是用Flash做的,而我们主要是H5页面,如果在微信里面有权限就可以通过JSSDK调起摄 ...
- Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等
仿照微信,朋友圈分享图片功能 .可以进行图片的多张选择,拍照添加图片,以及进行图片的预览,预览时可以进行缩放,并且可以删除选中状态的图片 .很不错的源码,大家有需要可以下载看看 . 微信 微信 微信 ...
随机推荐
- JavaScript入门篇
记录一下在慕课网学习JavaScript的过程. 以下内容均来自慕课网. 传送:https://www.imooc.com/code/401 为什么学习JavaScript 1. 所有主流浏览器都支持 ...
- 本地计算机上的 postgresql 服务启动后停止解决方法
在启动 postgresql 服务是遇到这种情况: 解决方法: 打开计算机管理====>查看应用程序日志信息,可以看出,由于日志配置错误的问题. 找到 postgresql.conf 文件,做如 ...
- GET 和 POST 的区别 以及为什么 GET请求 比 POST请求 更快
引子: 和朋友的聊天中得知他公司后台接口全部都是 POST 请求, 我表示很纳闷为什么全是 POST 请求呢? GET 比 POST 安全,或者说 便于后台方便,后台不用区分包装类 (所以全部用 P ...
- Pandas模块
前言: 最近公司有数据分析的任务,如果使用Python做数据分析,那么对Pandas模块的学习是必不可少的: 本篇文章基于Pandas 0.20.0版本 话不多说社会你根哥!开干! pip insta ...
- 棋牌平台开发教程之扎金花大小比较算法在php中的实现
PHP中扎金花比大小如何实现 在棋牌游戏中,不管是现实的还是线上的,扎金花无疑是最热门棋牌游戏之一,鄙人从小就酷爱扎金花,机缘巧合后面从事了IT行业,话不多说,直接进去正题吧. 扎金花两副牌的比较规则 ...
- 设计模式-builder(构造器模式)
好处: 多个属性时,可以清楚明了知道属性, 重叠构造起器的安全性和JavaBeans模式的可读性 只需要制定需要建造的类型就可以得到他们 实例: public class NutritionFacts ...
- css自定义滚动条
有没有觉得浏览器自带的原始滚动条很不美观,同时也有看到很多网站的自定义滚动条显得高端,就连chrome32.0开发板都抛弃了原始的滚动条,美观多了.那webkit浏览器是如何自定义滚动条的呢? 前言 ...
- DataGridView中的DataGridViewComboBoxColumn 让其值改变联动
在工作中自己也遇到过这类问题, 最近也有很多人问我这个问题, 就此机会写出来记录一下. 首先,顾名思义,值改变事件我们会想到 dataGridView1_CellValueChanged 这个事件,想 ...
- JavaScript js 引入CDN 不生效 注意事项
[博客园cnblogs笔者m-yb原创,转载请加本文博客链接,笔者github: https://github.com/mayangbo666,公众号aandb7,QQ群927113708]https ...
- Error "java.lang.NoClassDefFoundError:org/openxmlformats/schemas/spreadsheetml/x2006/main/CTExtensionList" in SoapUI
After upgrade readyAPI 1.9 to the higher version, pop up error "java.lang.NoClassDefFoundError: ...