问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

手机里的照片怎么压缩

发布网友 发布时间:2022-04-19 19:10

我来回答

4个回答

懂视网 时间:2022-05-16 02:56

前言

在手机上通过网页 input 标签拍照上传图片,有一些手机会出现图片旋转了90度d的问题,包括 iPhone 和个别三星手机。这些手机竖着拍的时候才会出现这种问题,横拍出来的照片就正常显示。因此,可以通过获取手机拍照角度来对照片进行旋转,从而解决这个问题。

Orientation

这个参数并不是所有图片都有的,不过手机拍出来的图片是带有这个参数的。

旋转角度参数值
1
顺时针90°6
逆时针90°8
180°3

参数为 1 的时候显示正常,那么在这些横拍显示正常,即 Orientation = 1 的手机上,竖拍的参数为 6。

想要获取 Orientation 参数,可以通过 exif.js 库来操作。exif.js 功能很多,体积也很大,未压缩之前足足有 30k,这对手机页面加载来说是非常大影响的。而我只需要获取 Orientation 信息而已,所以我这里删减了 exif.js 库的一些代码,将代码缩小到几KB。

exif.js 获取 Orientation :

EXIF.getData(file, function() { var Orientation = EXIF.getTag(this, 'Orientation');});

file 则是 input 文件表单上传的文件。上传的文件经过 fileReader.readAsDataURL(file) 就可以实现预览图片了,这方面不清楚的可以查看:HTML5 进阶系列:文件上传下载

旋转

旋转需要用到 canvas 的 rotate() 方法。

ctx.rotate(angle);

rotate 方法的参数为旋转弧度。需要将角度转为弧度:degrees * Math.PI / 180

旋转的中心点默认都在 canvas 的起点,即 ( 0, 0 )。旋转的原理如下图:

旋转原理图

旋转之后,如果从 ( 0, 0 ) 点进行 drawImage(),那么画出来的位置就是在左图中的旋转 90 度后的位置,不在可视区域呢。旋转之后,坐标轴也跟着旋转了,想要显示在可视区域呢,需要将 ( 0, 0 ) 点往 y 轴的反方向移 y 个单位,此时的起始点则为 ( 0, -y )。

同理,可以获得旋转 -90 度后的起始点为 ( -x, 0 ),旋转 180 度后的起始点为 ( -x, -y )。

压缩

手机拍出来的照片太大,而且使用 base64 编码的照片会比原照片大,那么上传的时候进行压缩就非常有必要的。现在的手机像素这么高,拍出来的照片宽高都有几千像素,用 canvas 来渲染这照片的速度会相对比较慢。

因此第一步需要先对上传照片的宽高做限制,判断宽度或高度是否超出哪个范围,则等比压缩其宽高。

var ratio = width / height;if(imgWidth > imgHeight && imgWidth > xx){imgWidth = xx;imgHeight = Math.ceil(xx / ratio);}else if(imgWidth < imgHeight && imgHeight > yy){imgWidth = Math.ceil(yy * ratio);imgHeight = yy;}

第二步就通过 canvas.toDataURL() 方法来压缩照片质量。

canvas.toDataURL("image/jpeg", 1);

toDataURL() 方法返回一个包含图片展示的 data URI 。使用两个参数,第一个参数为图片格式,默认为 image/png。第二个参数为压缩质量,在指定图片格式为 image/jpeg 或 image/webp的情况下,可以从 0 到 1 的区间内选择图片的质量。

总结

综合以上,例子的代码包括精简的exif.js库地址:file-demo

主要的核心代码如下:

<input type="file" id="files" ><img src="blank.gif" id="preview">
<script src="small-exif.js?1.1.11"></script><script>var ipt = document.getElementById('files'),img = document.getElementById('preview'),Orientation = null;ipt.onchange = function () {var file = ipt.files[0],reader = new FileReader(),image = new Image();if(file){EXIF.getData(file, function() { 
  Orientation = EXIF.getTag(this, 'Orientation');});
  reader.onload = function (ev) {image.src = ev.target.result;
  image.onload = function () {var imgWidth = this.width,imgHeight = this.height;
  // 控制上传图片的宽高if(imgWidth > imgHeight && imgWidth > 750){imgWidth = 750;
  imgHeight = Math.ceil(750 * this.height / this.width);
  }else if(imgWidth < imgHeight && imgHeight > 1334){imgWidth = Math.ceil(1334 * this.width / this.height);
  imgHeight = 1334;
  }var canvas = document.createElement("canvas"),ctx = canvas.getContext('2d');
  canvas.width = imgWidth;canvas.height = imgHeight;
  if(Orientation && Orientation != 1){switch(Orientation){case 6: 
  // 旋转90度canvas.width = imgHeight; canvas.height = imgWidth; 
  ctx.rotate(Math.PI / 2);
  // (0,-imgHeight) 从旋转原理图那里获得的起始点ctx.drawImage(this, 0, -imgHeight, imgWidth, imgHeight);
  break;case 3: // 旋转180度ctx.rotate(Math.PI); 
  ctx.drawImage(this, -imgWidth, -imgHeight, imgWidth, imgHeight);break;case 8: 
  // 旋转-90度canvas.width = imgHeight; canvas.height = imgWidth; ctx.rotate(3 * Math.PI / 2); 
  ctx.drawImage(this, -imgWidth, 0, imgWidth, imgHeight);break;
  }}else{ctx.drawImage(this, 0, 0, imgWidth, imgHeight);}img.src = canvas.toDataURL("image/jpeg", 0.8);
  }}reader.readAsDataURL(file);
  }}</script>

热心网友 时间:2022-05-16 00:04

一、极速img

1、打开手机百度直接搜索极速img,打开其网站首页即可开始压缩;

2、点击页面“+”上传图片或将图片直接拖到此页面均可。(免费攻略:单次只上传一张图片即可,每天都可免费转,但单次上传多张就是批量转换需要开通会员)

3、上传成功后图片会自动开始压缩,完成后点击下载即可。

热心网友 时间:2022-05-16 01:22

这个只能是下载第三方的压缩软件,手机自带的是不支持这个功能的。

热心网友 时间:2022-05-16 02:57

付费内容限时免费查看回答您好,亲,照片压缩需要借助工具,先找到[报名电子照助手]

在菜单中选择“图片压缩”

在线图片压缩工具可以完成手机照片旋转、裁剪、压缩、放大、清晰度增强等。

上传要处理的手机照片(证书、 证件照、*、证明材料等)

手机照片旋转为正,并且裁剪有效部分。

这里还教一招简单的压缩图片文件的方法。

1.先打开手机微信,点击微信搜索图标,搜索找到可以压缩图片文件的工具——微信小程序迅捷压缩。

2.接着打开这个压缩工具,这个工具上有四个功能,点击“图片压缩”这个功能。

3.点击“上传文件”,上传手机里需要压缩的图片文件,选中需要压缩的图片,点右上角的完成即可。

4.然后点击“立即压缩”这个按钮,稍微等一会。待图片压缩好了之后,点击保存,工具会将压缩的好的图片文件保存到手机相册了,可打开压缩后的照片,查看一下压缩效果。

亲,您好!疫情无情,人间有爱,如果我的解答对您有所帮助,还请给个赞(在左下角进行评价哦),期待您的赞,您的举手之劳对我很重要您的支持也是我进步的动力。如果觉得我的解答还满意,可以点我头像一对一咨询,也可以点击关注我。最后再次祝您身体健康,心情愉快 ! [微笑]

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
whether...ornot必须搭配着用么? whether必须跟or not吗 z97主板与b85有什么区别? b85主板和z97的区别有哪些 z97和b85有什么区别? shuxpai锁了屏怎么办? AI软件在保存文件时,出现"0x01d93ff0"指令引用的“0x00000000”内存。该... AI文件保存时保存不了。无法以此文件名存储。请以其它名称或在其它文... 上海买衣服最实惠的地方再哪 在上海买衣服去哪好呢? 手机照片大小怎么压缩 手机照片太大如何压缩小 手机照片太大怎么压缩 人们是怎样发现大自然中有天然指南针的 如何将两个网易邮箱账号合并成一个邮箱账号 如何把多个邮箱关联到outlook上 别的邮箱怎么关联QQ邮箱?就是能收到别的邮箱的邮... 两个163邮箱可以用一个手机号关联吗? 目前使用两个邮箱,outlook设置时只连接了一个邮箱... 问问大家如何设置QQ邮箱和Gmail的关联吗? QQ邮箱怎么关联多个QQ邮箱 跪求怎么把两个QQ邮箱连在一起 两个163邮箱怎么绑定到一起??? 两个QQ邮箱关联 qq邮箱怎么关联 拥有多个QQ邮箱帐号如何关联? 如何关联两个qq邮箱 邮箱关联怎么弄 怎么把两个QQ邮箱关联起来,可以相互查看邮件 两个qq邮箱可以绑定在一起吗?怎么操作 女子遇车祸才发现头部存在两根针,针是如何进入头部的? 投资组合的预期收益率和方差各是多少? 投资组合的方差怎么计算 资产组合的预期收益率、方差和标准差是如何衡量和... 股票的组合收益率,组合方差怎么求 大于两项的组合资产组合收益率的方差怎么求 资产组合的方差怎么算 股票的预期收益率和方差怎么算 投资组合收益率 假设市场投资组合的收益率和方差分别为12%和0.25,... 2.在计算由两项资产组成的投资组合收益率的方差时... 投资组合理论的内容 求证券的收益率方差 证券的最小方差如何计算 证券资产组合的收益率的方差关系式书上公式(上面... 已知四个股票CDEF在投资组合中的占比,也知道了他们... 投资组合标准差的公式怎么理解呀??? 有分求助!关于证券投资组合期望收益率和无风险利... 怎样计算由10支股票组成的投资组合收益率的标准差 马克维兹的投资组合理论的基本思路