重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
它的主要功能就是上传两张人像,通过算法进行分析对比,最后得出一个相似度的分数,以验证你们是天造地设还是颜值互补。
创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于成都做网站、网站建设、外贸营销网站建设、安达网络推广、小程序设计、安达网络营销、安达企业策划、安达品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联公司为所有大学生创业者提供安达建站搭建服务,24小时服务热线:18982081108,官方网址:www.cdcxhl.com
但是,当我们把上传的图片转换成base64格式,发送给后台时,会发现偶尔会出现问题,有一些图片本来是这样的:
柴犬
处理之后却变成了这样:
柴犬2
经过测试发现,只有iOS手机竖着拍的照片才会出现这样的问题,而iOS手机横着拍的照片、Android手机拍的照片以及通过屏幕截图、网络下载等途径获得的图片都不会产生这个问题。
那么,这到底是为什么呢?
在开发过程中,由于时间紧迫,未求甚解,使用了github上的一个开源项目 lrz.js 来解决此问题,这个工具的主要用途是在尽量保证图片质量的前提下压缩图片的大小,但同时也附带了图片旋转角度纠正的功能。
通过阅读 lrz.js 的源代码,我发现它引入了一个叫做 exif.js 的库来实现旋转角度的纠正,它提供了js读取图像的原始数据的功能扩展,例如:拍照方向、相机设备型号、拍摄时间、ISO 感光度、GPS 地理位置等数据。而拍照方向就是关键所在!
exif.js 获取图像的拍照方向的代码如下:
EXIF.getData(IMG_FILE, function () { // IMG_FILE为图像数据
var orientation = EXIF.getTag(this, "Orientation");
console.log("Orientation:" + orientation); // 拍照方向
});
获取拍照方向的结果为1-8的数字:
拍照方向信息
注意:对于上面的八种方向中,加了*的并不常见,因为它们代表的是镜像方向,如果不做任何的处理,不管相机以任何角度拍摄,都无法出现镜像的情况。
这个表格代表什么意义?我们来看第一行,值为1时,右边两列的值分别为:Row #0 is Top,Column #0 is Left side,其实很好理解,它表示照片的第一行位于顶端,而第一列位于左侧,那么这张照片自然就是以正常角度拍摄的。
而这8种结果,就是第一行与第一列所在的位置的8种组合。
那么,我们来测试一下iOS手机横着拍的照片,来看看它的拍照方向是什么呢?
测试1
结果是1,即以正常角度拍摄的,其实也就是原图啦~
那么,我们再测试一下iOS手机竖着拍的照片,来看看它的拍照方向是什么呢?
测试2
原来是6!即第一行位于右侧,第一列位于顶端,其实相当于将照片顺时针旋转了90度!
所以,实际上iOS手机竖着拍出的照片与横着拍出的照片其本质上是一样的,只不过竖着拍出的照片被添加了一个顺时针旋转90°的拍照方向,所以显示的时候,就变成了上下边窄左右边宽的状态,其实也就是横着拍的照片顺时针旋转90°而成的~
那么明白了这些,文章开头所说的照片旋转bug的原因,也就很简单啦~
其实就是当我们在前端对图片进行像素处理或者drawInRect等操作之后,照片的Orientaion信息,即为拍照方向信息被删除了,所以iOS手机竖着拍的照片又回到了横着的状态,看起来也就是逆时针旋转了90°!
那么如何纠正这个旋转角度呢?
其实思路也很简单:在处理图片之前,先读取并保存图片的拍照方向信息,然后在处理图片之后,再根据拍照方向,对图片进行相应的调整,lrz.js 中的代码如下:
switch (orientation) {
case 3:
ctx.rotate(180 * Math.PI / 180);
ctx.drawImage(img, -resize.width, -resize.height, resize.width, resize.height);
break;
case 6:
ctx.rotate(90 * Math.PI / 180);
ctx.drawImage(img, 0, -resize.width, resize.height, resize.width);
break;
case 8:
ctx.rotate(270 * Math.PI / 180);
ctx.drawImage(img, -resize.height, 0, resize.height, resize.width);
break;
case 2:
ctx.translate(resize.width, 0);
ctx.scale(-1, 1);
ctx.drawImage(img, 0, 0, resize.width, resize.height);
break;
case 4:
ctx.translate(resize.width, 0);
ctx.scale(-1, 1);
ctx.rotate(180 * Math.PI / 180);
ctx.drawImage(img, -resize.width, -resize.height, resize.width, resize.height);
break;
case 5:
ctx.translate(resize.width, 0);
ctx.scale(-1, 1);
ctx.rotate(90 * Math.PI / 180);
ctx.drawImage(img, 0, -resize.width, resize.height, resize.width);
break;
case 7:
ctx.translate(resize.width, 0);
ctx.scale(-1, 1);
ctx.rotate(270 * Math.PI / 180);
ctx.drawImage(img, -resize.height, 0, resize.height, resize.width);
break;
default:
ctx.drawImage(img, 0, 0, resize.width,resize.height);
}
其中,translate是平移变换,scale(-1,1)是向左翻转,rotate是顺时针旋转。
举例说明 case 2,当图片的拍照方向为2时,即第一行位于顶端,而第一列位于右侧,其实相当于把照片进行了左右的翻转。所以,这里对图片的操作是,先向右平移等于图片宽度的距离,再向左翻转,这相当于以图片水平方向的对称轴为轴进行了左右翻转,然后再以(0,0)为起始点绘制原宽高的图片,即完成了对拍照方向的纠正。
最后
经过一系列的测试,发现确实只有iOS手机的竖拍照片与横拍照片是通过拍照方向来区别的,Android手机无论竖拍还是横拍的照片,拍照方向都为1,也就是说即使丢失了拍照方向这一信息,也不会影响到图片的旋转角度。而手机或电脑的屏幕截图、网络上的图片、通过PS制作的图片等也是如此。
作者:任无名F
链接:
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
图片文件压缩1M以内,但是图片画面清晰质量不变,可以使用以下操作方法:
1、获取工具“秒会压缩大师”,选择操作
2、导入图片进行操作。
3、最后等待图片压缩完成。
4、说明压缩模式:
缩小优先(适合用于个人资料图片和缩率图)
均衡压缩(适合用于电子邮件和消息发送)
清晰优先(适合查看)
推荐理由:
1. 模式压缩图片:可根据需求选择图片压缩模式(如缩小优先、清晰优先),并支持自定义设图片压缩的清晰度、分辨率、格式以及希望大小。
2. .操作简单快速:可一次性上传多张需要压缩的图片文件,批量进行图片压缩处理,支持根据压缩前与压缩后的文件大小对比确认压缩结果是否符合预期效果,节约图片压缩的时间成本。
3. 保障文件安全:图片压缩在线版对压缩过程进行了多重加密处理,并且在压缩完图片文件的30分钟后,便会将所有文件从服务器中永久删除,期间无人能查阅或下载这些文件,让你的文件与隐私得到保障。
支持多种格式:图片:支持JPG、PNG、GIF、BMP等图片格式;视频:支持MP4、MKV、MOV、AVI、WMV、M4V、MPEG等视频格式;PDF:PDF文档均可压缩;Word:支持doc、docx等Word格式;PPT:支持ppt、pptx等PPT格式;
这个很容易实现啊,比如用这个在线图片压缩工具,想把图片文件的大小减到多少都行,直接设置一下数值,马上瞬间就能完成了。在线智能压缩图片大小,图片降低像素,PNG|JPG大图缩小
▼ 在线一键压缩图片步骤:
一、首先点击加号添加需要压缩的图片。目前已知支持对jpg、png等多种常见的图片格式进行压缩,如果上传图片并压缩成功,则代表支持该图片格式。
二、可以自行修改图片需要被压缩到的最大宽高尺寸,默认为图片原始的宽高尺寸,且宽高比例是自动锁定的。
三、必须设置图片被压缩后,期望输出的图片文件的最大占用空间。(必填项)
四、选择图片生成的算法。默认为混合优先算法,绝大多数情况下使用默认算法即可。
五、压缩的设定值不能小于1Kb,但图片压缩的最终效果可以小于1Kb。
HTML是用来做网站的一种语言哈,就是在html里面改变图片的大小就要改变文件代码,打开图片源代码,图片文件的大小是height,和宽,我们可以更改,在语言中我们需要设置的都是英文的。
现在压缩工具将图片缩小之后都会对画质有影响,压缩图片文件选择压缩工具页面中的普通压缩就可以了压缩程度不要过大,找到图片压缩工具,图片要放置在工具页面上进行数据分析,根据图片的大小工具会制定压缩方案。
图片分享论坛却只允许发几百KB的文件;微信、分享给朋友的时候自动压缩的图像都比较模糊
可以参考chrome小乐图客扩展的截图功能,支持粘贴剪贴板图片、拖拽图片、或者粘贴图片网址上传,是通过html5 file reader实现的。