传输图片文件压缩后传输会快吗太大了,可以压缩之后再传输图片吗?

图片上传失败文件太大,如何压缩图片?图片上传失败文件太大,如何压缩图片?科技照百家号图片上传失败文件太大,如何压缩图片?一、准备好需要修改的图片,运用PS软件进行修改图片的大小,获取需要大小的图片。给的是扫描的图片,尺寸比较大,编者之前直接用PS打开,修改图片的格式,还是没有压缩到想要的大小。问题的原因是,扫描出来的图片尺寸像素比较大。压缩不成功重新新建一个文件 A4纸尺寸大小的像素A4纸的尺寸是210mm×297mm,当你设定的分辨率是72像素/英寸时,A4纸的尺寸的图像的像素是595×842当你设定的分辨率是150像素/英寸时,A4纸的尺寸的图像的像素是,当你设定的分辨率是300像素/英寸时,A4纸的尺寸的图像的像素是,你选择不同的分辨率,图像像素大小也随之变化.2.这次直接把图片拖进来 由于尺寸小了,图片大小也变的比较小了,存储就是想要大小的尺寸了。本文由百家号作者上传并发布,百家号仅提供信息发布平台。文章仅代表作者个人观点,不代表百度立场。未经作者许可,不得转载。科技照百家号最近更新:简介:IT行业日常资讯,最新写照作者最新文章相关文章查看: 280|回复: 10
怎么把很多照片都压缩到一个文件夹里?往邮箱里传照片怎么能不一张张的传?
看人不看你
建一个文件夹,把要压缩的相片全考进文件夹下,然后在文件夹点右键,压缩就可以了,邮箱里传相片,不一张一张的的传,只是将相片打包,当然压缩包不要太大,别大于2M,太大了,容易上传失败,
打包压缩的图片文件是不能在邮箱中查看的,其实图片文件压缩后也节省不了什么空间,可以逐一上传到邮件中去,那样对方就可以查看了。
?以QQ邮箱为例,快速发送大量的照片方法是: 1、把大量照片放进一个文件夹,把文件夹压缩成一个压缩文件。 2、把文件上传到文件中转站。如下图: 2、选择要上传的文件。 3、点击写信,点击越大附件,选择从文件中转站选择--选择--确定。如
亲,只能把文件夹打包成压缩包,RAR等。添加压缩文件
我遇到过一次这种情况,下载99%就定住了,不知道什么原因》但是用IE下载就可以,不要用360网页自带的下载。
lutaipanpang
可以,将多张照片放到一个文件夹里,然后将文件夹压缩再发到邮箱。 需要安装压缩软件,如WinRAR、360解压缩软件等进行压缩打包,然后再发送。 以WinRAR和163邮箱为例, 1. 电脑上下载并安装WinRAR软件。 2. 将照片放到文件夹中。 3. 打开这个文
除了楼上说的打包后添加到附件外,还有一个简单的方法。就是使用QQ邮箱的附件拖拽上传功能。 打开写邮件窗口,点“添加附件”旁边的向下箭头,按提示安装附件拖拽上传功能的jar插件。安装完成后,再点这个箭头时,箭头会朝上,同时打开附件拖拽上
这需要有压缩软件(WinRAR压缩软件),先将你的图片放到一个文件夹里。然后点击右键弹出的菜单里有将你的文件压缩的选项,点击就可以了。 如果没有压缩软件需要去下载一个,就是WinRAR,安装后和上面的操作一样。
别人电脑内,文件夹——右键——排列图标, 的方式, 需要与你的电脑内,文件夹——右键——排列图标 的方式一致。
Copyright &输入关键字或相关内容进行搜索
下方的代码是比较OLD的了,是通过js进行图片的剪切 旋转 再生成,效率较低。
后来又整合了一个利用native.js本地接口的压缩代码 ,
。页面中有详细的说明,需要的童鞋们可以参考以下。代码整合了
两个人的demo,
其中resize原来的filereader在5 中更改为plus.io.FileReader()方不报错。
如有错误,请不吝批评指正。更新日志:
1.修复了ios下无法获取图片宽高的问题:
ios下不在img.onload中是获取不到文件对象的。
2. 新增了最大宽度(高度)的判别,按比例压缩。
具体代码如下:&!DOCTYPE html&
&meta charset=&utf-8&&
&meta name=&viewport& content=&width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no& /&
&title&&/title&
&link href=&http://ask.dcloud.net.cn/../../../css/mui.min.css& rel=&stylesheet& /&
&style type=&text/css&&
background-color: #efeff4;
.mui-content {} .mui-content a {
color: #8F8F94;
.mui-content a.active {
color: #007
.mui-title {
font-family:
bottom: 100
bottom: 20
.mui-btn-block {
width: 90%;
.showimg {
margin: 20px 10px auto 10
text-align:
&header class=&mui-bar mui-bar-nav&&
&a class=&mui-action-back mui-icon mui-icon-left-nav mui-pull-left&&&/a&
&h1 class=&mui-title&&上传身份证照片&/h1&
&a class=&mui-pull-right mui-icon mui-icon-upload& onclick=&imgupgrade()&&&/a&
描述:参考 http://ask.dcloud.net.cn/question/2089
&div class=&mui-content&&
&div class=&showimg&&
&button type=&button& class=&mui-btn mui-btn-primary mui-btn-block
btn_1& onclick=&galleryImgs()&&从相册中选择图片&/button&
&button type=&button& class=&mui-btn mui-btn-success mui-btn-block btn_2& onclick=&cameraimages()&&拍照&/button&
&script src=&../../../js/mui.min.js&&&/script&
&script src=&../../../js/binaryajax.js& type=&text/javascript& charset=&utf-8&&&/script&
&script src=&../../../js/exif.js& type=&text/javascript& charset=&utf-8&&&/script&
&script src=&../../../js/canvasResize.js& type=&text/javascript& charset=&utf-8&&&/script&
&script type=&text/javascript&&
mui.init();
mui.plusReady(function() {})
//上传单张图片
function galleryImg() {
//每次拍摄或选择图片前清空数组对象
f1.splice(0, f1.length);
document.getElementsByClassName(&showimg&)[0].innerHTML =
// 从相册中选择图片
mui.toast(&从相册中选择一张图片&);
plus.gallery.pick(function(path) {
showImg(path);
}, function(e) {
mui.toast(&取消选择图片&);
filter: &image&,
multiple: false
function galleryImgs() {
//每次拍摄或选择图片前清空数组对象
f1.splice(0, f1.length);
document.getElementsByClassName(&showimg&)[0].innerHTML =
// 从相册中选择图片
mui.toast(&从相册中选择不超过两张图片&);
plus.gallery.pick(function(e) {
if (e.files.length != 2) {
mui.toast('请选择身份证正面和背面照片共两张');
for (var i in e.files) {
showImg(e.files[i]);
}, function(e) {
mui.toast(&取消选择图片&);
filter: &image&,
multiple: true
// 拍照添加文件
function cameraimages() {
//每次拍摄或选择图片前清空数组对象
f1.splice(0, f1.length);
document.getElementsByClassName(&showimg&)[0].innerHTML =
var cmr = plus.camera.getCamera();
cmr.captureImage(function(p) {
plus.io.resolveLocalFileSystemURL(p, function(entry) {
var localurl = entry.toLocalURL(); //把拍照的目录路径,变成本地url路径,例如file:///........之类的。
showImg(localurl);
}, function(e) {
mui.toast(&很抱歉,获取失败 &
// 全局数组对象,添加文件,用于压缩上传使用
var f1 = new Array();
function showImg(url) {
// 兼容以“file:”开头的情况
if (0 != url.toString().indexOf(&file://&)) {
url = &file://& +
var _div_ = document.getElementsByClassName(&showimg&)[0];
var _img_ = new Image();
_img_.src = // 传过来的图片路径在这里用。
_img_.onclick = function() {
plus.runtime.openFile(url);
_img_.onload = function() {
var tmph = _img_.
var tmpw = _img_.
var isHengTu = tmpw &
var max = Math.max(tmpw, tmph);
var min = Math.min(tmpw, tmph);
var bili = min /
if (max & 1200) {
max = 1200;
min = Math.floor(bili * max);
tmph = isHengTu ? min :
tmpw = isHengTu ? max :
_img_.style.border = &1px solid rgb(200,199,204)&;
_img_.style.margin = &10px&;
_img_.style.width = &150px&;
_img_.style.height = &150px&;
_img_.onload =
plus.io.resolveLocalFileSystemURL(url, function(entry) {
entry.file(function(file) {
console.log(file.size + '--' + file.name);
canvasResize(file, {
width: tmpw,
height: tmph,
crop: false,
quality: 50, //压缩质量
rotate: 0,
callback: function(data, width, height) {
f1.push(data);
_img_.src =
_div_.appendChild(_img_);
plus.nativeUI.closeWaiting();
function(e) {
plus.nativeUI.closeWaiting();
console.log(e.message);
function imgupgrade() {
mui.toast('后台联调时启用上传功能');
var wt = plus.nativeUI.showWaiting();
var url = '后台地址';
var dataType = 'json';
//发送数据
var data = {
files1: f1 //base64数据
mui.post(url, data, success, dataType);
//成功响应的回调函数
var success = function(response) {
plus.nativeUI.closeWaiting();
if (response != null) {
alert(&上传成功&);
\n伟子的js代码我放在了附件中。
PHP端怎么接收,求教下
为什么传参到后台一直是null
哥,PHP不会写、、、、、、、、上面能弄了,就是上次那部分,能给源码看看么、、、
改成plus.io.FileReader(file, {
我刚试了的
canvasResize is not defined
为什么说没有定义呀
不用获取,直接做得base64,入库就行了
你的弄好了吗,我php不知道如何获取数据
php 端怎么获取数据呢?
这套代码好像只能用楼主提供的版本插件、我另外找的插件版本不同就会报错、感谢楼主分享~
上传为后台的时候显示的也是空
base64上传到服务器时,后台通过string来获取吧?我用string获取时是null值
图片渲染出来很慢
多张图片宽度高度获取不到呀!
ihpone5下面打开了照相机,但是无法拍照
js包在哪里呢?我没找到哦
plus is not defined 一直报这个错误
安卓手机app的webview也无法打印plus出来
plus is not defined
一直报这个错误
这个解决了吗
我也遇到这个问题了
分享一下呗
只能一次性上传两个吗?
我上传3个或以上
就上传失败 是为什么啊
请问有那个一如的js吗
分享 出来可好
我的会报 Uncaught ReferenceError: plus is not defined错误
压缩怎么没有效果?
我想删除图片怎么删除啊!
请问,怎么删除图片啊
多个上传失败了
等了一会自己好了
为什么js css都引了点了没反应呀
plus is not defined 是怎么哪里的问题呢
PHP端的 多图怎么写呢?好急好急
大神,有Java服务端代码么?谢谢!
不可以删除照片吗?
canvasResize:
line 249 :
var reader = window.plus ? new plus.io.FileReader() : new FileReader();
window.plus ? reader.readAsDataURL(file) : reader.readAsBinaryString(file);
做如上更改以兼容
是的 没做兼容
是不是在浏览器上运行就会报plus is not defined
plus is not defined
Uncaught ReferenceError: plus is not defined
{&statusText&:&Method Not Allowed&,&status&:405,}这是什么原因YA?
多张图片上传的时候,我测试了一下,打印出来为空值的,而且上传不到服务器,请问是怎么回事?!
为什么微信在朋友圈发照片时,可以选照片,也可以点击拍照,这样的效果怎么实现呢?
ios图片显示问题你解决没呢,我也遇到额
请问怎么得到图片的对象呢?我用bmob后端云,他们貌似只支持这种方式上传文件
var bytes = &Hello, World!&;
var file = new Bmob.File(&hello.txt&, bytes);
file.save().then(function(obj) {
//alert(obj.url());
}, function(error) {
// the save failed.
请问用C# ,后台base64图片是怎么解码的?
下载附件里面的js
我的也报 : canvasResize is not defined
为什么会报这个错mui.init();init()未定义
为毛只显示一截图片,转成base64后
,我在上传前把base64编码恢复成图片只显示原来图片的一小截?是什么原因?
打包之后再试试
我也是这个原因,你是怎么解决的?
canvasResize 这个方法压缩图片好像没有生效,压缩后还是那么大
同问,哪个效率高
1、plus.zip压缩之后的文件,上传到server之后如何解压/处理?
2、上传效率比较,plus.uploader与mui.post,也就是file upload form-data与base64上传,哪个更好?
在附件里面,太不显眼了,漏掉了。
&script src=&/static/css/default/img/default.jpg& data-original=&../../../js/canvasResize.js& type=&text/javascript& charset=&utf-8&&&/script&
这个JS哪里下载吗
canvasResize这个方法不存在
拍照确认的时候,经常会自动退出程序,不知是啥原因
多图上传 php 后端如何处理
ios 没有返回键 在相册中选择图片列表,如果不选择图片怎么返回啊
怎么我这句一直报错啊plus.gallery.pick(function(e) {
undefined is not an object (evaluating 'f1.splice')
目前HTML5+已经在plus.zip里提供了compressImage的原生图像压缩。
具体见:[http://www.html5plus.org/doc/zh_cn/zip.html#plus.zip.compressImage](http://www.html5plus.org/doc/zh_cn/zip.html#plus.zip.compressImage)
[http://ask.dcloud.net.cn/article/123](http://ask.dcloud.net.cn/article/123)
我尝试了下,一直都是返回:type:xhrReadyState:4;errorThrow:SyntaxError: JSON Parse error: Unexpected identifier &Array&;xhr.status:200。请问是什么问题呢?服务器貌似一直接收不到消息,把f1换成字符串就可以了。
mui.toast(&很抱歉,获取失败 &
这段代码有问题,少了个+号
_img_.onload 这里ios执行不下去了,发现
_img_.src = 这里有问题,如果将url改成网络上的图片链接,就可以了,是不是本机上
_img_.src = 不用加载呢
这个传到服务器的f1是什么格式的数据(没base64之前)
代码没有跑通,在canvasResize 的 callback 返回时没有console.lo 出数据,是不是我哪里弄错了?哪里能下到源码呢?
plus is not defined...怎么解决
试了一下,根本就没压缩效果嘛,没压缩前1M,压缩后居然还是1M,quality设为10反而照片越大
有.net服务端代码吗
测试 f1更换为字符 'abcd' 就ok的 能接收到值, 否则 服务器端为空值
var data = {
files1:f1 //base64数据
目测会很棒
图片太大,卡到showWaiting是怎么解决?
厉害啊,非常感谢
我搞定了,换了方法,resolveLocalFileSystemURL http://www.dcloud.io/docs/api/zh_cn/io.shtml#plus.io.resolveLocalFileSystemURL
我刚用ios测试了下,确实是这样
我在Android4.4 下测试没问题 , 你要是解决问题了分享一下
plus.io.requestFileSystem 下能打log出来, fs.root.getFile下就没有了
试了让它alert error message, 提示&不允许修改&..
难道是ios文件权限问题?
是不是图片比较大的原因,最好调试一下
ios上貌似会卡在showWaiting()上,无法显示图片呢,请问是什么原因
代码高亮遮住了
其中有几处错误
url = &file://&
中少了个+号吧?
mui.toast(&很抱歉,获取失败 &
后面多了个e
要回复文章请先或
相关代码及分享在http://www.cnblogs.com/phillyx
赞助DCloud可免广告,
赞助DCloud可免广告,如何将很多照片压缩成一个文件发出去,并使其大小变小?_百度知道
如何将很多照片压缩成一个文件发出去,并使其大小变小?
我在一个文件夹里有很多照片,想压缩成一个文件包,右键点击文件夹选择“添加到压缩文件”以后,压缩出来的照片大小还是和以前一样呢,请问怎样使其体积变小啊!谢谢!
注:不使用PHOTOSHOP
我有更好的答案
这里有两个疑问?你是想要把压缩的文件变小,还是要把图片变小。如果是要把压缩的文件变小,压缩时选择高度压缩选项(具体是不是这么叫我忘了,反正就是选择最高的压缩率),自然压缩出来的文件会变小。如果是想把图片变小就不建议使用压缩软件来完成,利用图片格式的批量转化可以达到使图片变小的效果。(从高清晰转化为中等会更低的分辨率即可使文件变小)
采纳率:54%
就直接把那个有图片的文件压缩就行了啊
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。App图片压缩裁剪原理和上传方案,以及那些有趣的事儿... - 简书
App图片压缩裁剪原理和上传方案,以及那些有趣的事儿...
本文始发于我的博文,现转发至此。
App怎么压缩质量?
iOS和Android压缩接口
如何计算图片的大小?
JPEG&JFIF压缩做了什么?
色彩空间转换
离散余弦变换
App怎么裁剪分辨率?
图片压缩裁剪上传方案
实验一:上传速度
实验二:用户设备主要分辨率
实验三:上传的照片的主要分辨率
实验四:压缩质量的大致规律
实验五:等比例裁剪后压缩质量的大致规律
实验六:WebP压缩
图像的一些概念澄清
压缩算法概念
微信图片处理规律
Base64编码后大小
iOS的pt与Android的sp
Android图片质量会比iPhone的差?
iOS的UIImage保存图片问题
压缩再压缩做了什么
最近有反馈说App上传图片偶尔会失败,特别是在网速慢和iPhone 6s的机器上。有些提示是“413 Request Entity Too Large”,Request大小1.15MB。之前只是简单地压到0.7,没有做裁剪等其他处理。
所以这几天整体研究下iOS和Android的图片压缩裁剪和JPEG压缩原理,也稍微找了微信发图片的规律,越深入发现越多有趣的东西,问题一环扣一环。
App怎么压缩质量?
最先接触的是压缩质量,所以看下压缩质量做了什么。
iOS和Android压缩接口
UIImageJPEGRepresentation(UIImage * __nonnull image, CGFloat compressionQuality);
// return image as JPEG. May return nil if image has no CGImageRef or invalid bitmap format. compression is 0(most)..1(least)
* Write a compressed version of the bitmap to the specified outputstream.
* If this returns true, the bitmap can be reconstructed by passing a
* corresponding inputstream to BitmapFactory.decodeStream(). Note: not
* all Formats support all bitmap configs directly, so it is possible that
* the returned bitmap from BitmapFactory could be in a different bitdepth,
* and/or may have lost per-pixel alpha (e.g. JPEG only supports opaque
* pixels).
* @param format
The format of the compressed image
* @param quality
Hint to the compressor, 0-100. 0 meaning compress for
small size, 100 meaning compress for max quality. Some
formats, like PNG which is lossless, will ignore the
quality setting
* @param stream
The outputstream to write the compressed data.
* @return true if successfully compressed to the specified stream.
compress(CompressFormat format, int quality, OutputStream stream)
从官方注释看,iOS的compressionQuality取值从0-1,且“1”注明是least,也就是说“1”不是不压缩,而是压缩强度最弱;Android的quality取值0-100,也是100代表最大质量,不是不压缩。最后面测试也验证了这个问题,而不是网上很多文档说的不压缩。我们先统称compressionQuality和quality为质量系数,下文也是。
于是拍了一张照片A,然后Android和iOS都压缩得到照片B。
对比了A、B两张图,想看看到底影响了什么:
宽度:2448像素
高度:3264像素
分辨率:72像素/英寸
文档:22.9MB
通道:3(RGB)
注:需弄明白附录的关于图像的一些概念澄清。
两张照片看到的参数都一样,那为什么它们的文件大小会不一样呢?(过程中发现iOS的UIImage会做多一些工作,使得实验结果有误,原因后面会提到。)(用Picasa看图软件可以查看质量,数值上看到等于我们的质量系数)所以就想到第二个问题,文件大小怎么计算的?由什么决定?
如何计算图片的大小?
总分辨率 * 像素表示的位数。
像素表示的位数:这就涉及到色彩模式,比较常见有RGB、CMYK、YUV等。RGB一般用RGB24(还有RGB555、RGB565、RGB32),即红绿蓝都分别用8位表示,所以用了24位表示一个像素,可以组合出2^24种颜色。
上面两张图水平有2448个像素,垂直有3264个像素,每个像素用24b表示,按这公式大小应该都是:b=.86MB。为什么呢?
后来明白,原来这公式是算位图的占用空间大小,而JPEG&JFIF是将位图压缩,不仅压缩图像质量还压缩图像占用空间(后面会讲到)。也就是说图像压缩不等于压缩质量和分辨率,还有压缩占用空间。
网上查到JFIF文件没有计算大小的公式,因为压缩质量和压缩后大小没有特定关系,如线性关系。那?么JPEG&JFIF压缩做了什么?这个质量到底代表了什么?
JPEG&JFIF压缩做了什么?
其实JPEG&JFIF做了两件事情:
去掉视觉上的冗余信息
去掉数据本身结构的冗余
第一步实现通过色彩空间转换、缩减取样、离散余弦变换、量化,第二步实现通过编码。
其实这部分可以选择跳过,只是我为了理解压缩质量是怎么体现的而去看的,后面也发现理解后很多问题都很清晰明白。
色彩空间转换
JPEG需要YUV色彩模式,所以需要将RGB转成YUV:
Y=0.299R'+0.587G'+0.114B'
U=-0.147R'-0.289G'+0.436B'
V=0.615R'-0.515G'-0.100B'
YUV分别代表亮度、色度、饱和度,因为人类的眼睛对于亮度差异的敏感度高于色彩变化,所以一般会对U、V进行缩减采样。在JPEG上这种缩减取样的比例可以是4:4:4(无缩减取样)、4:2:2、4:2:0。所以经常会看到YUV444,YUV422和YUV420等。
离散余弦变换
将每个8x8的子区域转换到频率空间,这部分是无损的。
-415 -30 -61
-25 -29 10
量化是有损的过程,也是失真的主要原因。上面矩阵中每个值都是幅度,量化是利用人眼特点在高频率上降低信息的数量(简单地把频率领域上每个成分,除以一个对于该成分的常数就可完成,且接着舍位取最接近的整数),与一个基本矩阵运算然后得到一个新的矩阵,该新矩阵数据基本集中在左上角。
其实量化做的就是减少非0系数幅度和增加0值系数的个数。
我们接口中的质量系数就是和这里的基本矩阵有关。
Z扫描0值行程长度编码、哈夫曼编码。
Z扫描0值行程长度编码利用了量化后矩阵的特点,使得0值的都能串在最后面,对于过早结束的最后用EOB表示。
这一步就是压缩文件的占用空间。
App怎么裁剪分辨率?
弄清楚压缩质量问题后,我们知道,影响位图的大小有分辨率,那么减少分辨率也就能使压缩得更小了。注意这里裁剪分辨率不等于裁剪图片,不会丢失图片的某一部分。
UIGraphicsBeginImageContext(newSize);
[imageFixed drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
Bitmap image = BitmapFactory.decodeStream(file);
int bitmapWidth = image.getWidth();
int bitmapHeight = image.getHeight();
Matrix matrix = new Matrix();
matrix.postScale(scaleRatio, scaleRatio);
Bitmap scaledBitmap = Bitmap.createBitmap(image, 0, 0, bitmapWidth, bitmapHeight, matrix, false);
我们是等比例裁剪,比例和裁剪后占用空间大小并不一定成线性关系,这个裁剪具体怎么实现的和每个像素的质量有关系。
图片压缩裁剪上传方案
明白一个图片的清晰度等受什么影响之后,可以来定下方案了,但是还得做些测试获取数据,依据数据结果来定方案。
实验一:上传速度
我们用Charles模拟了各种网络环境下上传相同照片的网速:
| :----: | :----: | :---: | :----: |
| 速度KB/s | 754.78 | 115.4 | 115.78 | 116.25 |
| 100M光纤 |
| :----: | :----: | :---: | :----: |
| 速度KB/s | 174.65 | 167.33 | 114.18 | 174.73 |
这些不等价于我们用户的网速平均值,而且只取一次样本,所以只是作为参考。
实验二:用户设备主要分辨率
因为照片都是在用户设备上看的,所以了解下用户的主流分辨率,将分辨率裁剪到趋近或稍大于该主流分辨率会比较适合。iOS和Android都取接近的值。
在友盟查看了我们的应用的相关数据:
Android,较大占比的是宽度1080像素和720像素的设备。宽度1080像素的,新增用户占比49.69%,启动次数占比44.29%;宽度720像素的,新增用户占比32.47%,启动次数占比37.76%。
iOS,较大占比的是宽度1242像素、750像素和640像素的设备。宽度1242像素的,新增用户占比31.84%,启动次数占比26.91%;宽度750像素的,新增用户占比36.20%,启动次数占比31.59%;宽度640像素的,新增用户占比20.36%,启动次数占比20.84%。
实验三:上传的照片的主要分辨率
找下上传的照片的主要分辨率,可以针对这些分辨率去确定和衡量方案。
也是在友盟上看我们的应用的数据:
iOS主流机型是iPhone6、iPhone6s、iPhone6 Plus、iPhone6s Plus,占到70%左右。它们的拍照分辨率分别是,。
Android相对较碎片化,只能是针对最大的分辨率去衡量。
实验四:压缩质量的大致规律
照片压缩后的数据大小(单位B):
照片压缩后的数据大小(单位B):
会出现压缩出来反而比原图大的问题,后面会讨论
在没有裁剪的情况下,压到0.6依旧不是太理想,特别是分辨率更高的照片。
在excel表格中将数据组成折线图,可以看出在0.9、0.8的时候下降幅度较大,后面相对平缓一点。
实验五:等比例裁剪后压缩质量的大致规律
照片等比例压缩到宽度1224像素时的数据大小(单位B):
照片等比例压缩到宽度1224像素时的数据大小(单位B):
可以看到裁剪这个分辨率后压缩质量0.6的大小相对可接受,而且图片质量影响也较小。
在这个分辨率下,压缩质量0.8时基本压缩到1/4至1/5。
实验六:WebP压缩
WebP据称在同等质量下大小可以压缩至JPEG的2/3。在iOS和Android都做了WebP的压缩测试,发现压缩速度非常慢,需要20s-35s,这是很不可接受的。上网查到WebP的压缩效率的确较慢,是JPEG的8倍左右,而且相比JPEG需要耗费更多的系统性能。所以本来想用WebP做兜底的方案暂时落空。
方案的目的是:
上传图片不超时
处理后质量清晰度可接受
缩短上传耗时
结合实验结论:
根据实验一,平均上传速度100KB/s,另外我们测试很差情况下有15KB/s的情况。我们的接口超时30s,所以可接受的图片大小最大为450KB。
根据实验二,等比例宽度取750-1242像素比较合适。
根据实验三、四、五,等比例裁剪到宽度1224像素后压缩至0.6、0.7大小相对可接受。质量相对可接受(主观感受)。
讲到,通常建议JPG质量最好是在60左右的原因。当在Photoshop中把质量设置低于51的时候,它就会执行另一个叫做“降色采样”的优化算法,它会在8个像素周围平均采样,这样会在边缘产生杂色。
定下方案:
照片宽度大于1224像素(因为iPhone6照片宽度2448所以想取个可以整除的)时等比例裁剪宽度成1224。因为分辨率太大甚至两倍于手机分辨率实际没有任何用处。
压缩质量系数至0.8(80)看下大小是否小于300KB,排除一些小分辨率的照片。小于则上传,大于则继续压缩,取0.7(70),排除一些中等的,如果还大于则取0.6(60)后不判断直接上传。根据上面的实验可以看到在宽度1224像素下基本都会小于300KB,大于的则处于450KB内,且450KB是网速最差的情况,因此基本可以保证上传。
方案目前看压缩的质量和时间控制都相对较好,但是还要继续观察一段时间看需不需要再调整参数。在这过程中理清了很多概念,了解了图片压缩过程中发生了什么事情,挺有趣的,根本停不下来。
文中涉及到的一些概念以及发现的一些其他相关事情。
图像的一些概念澄清
其实图像真正的信息是它的总分辨率(图像宽度x图像高度)和分辨率(水平分辨率&垂直分辨率),而涉及到英寸、厘米等长度单位时的大小,其实不是图像的信息,只是在涉及到外部,比如打印、设备屏幕显示等等时,换算出来的。
水平分辨率&垂直分辨率
分辨率一般单位ppi(也有dpi),即每英寸上多少个像素。水平分辨率即水平方向上像素个数/水平长度,垂直分辨率同理。一般水平分辨率和垂直分辨率是相等的,所以日常也简称为分辨率。dpi即每英寸上多少点。这两个单位根据不同显示设备有换算关系。
图像宽度&图像高度
其实标准些,讲宽度&高度时一般是讲图像水平/垂直上有多少个像素。如一张的照片,则宽度是2448像素,高度是3264像素。也有讲宽度是86.36厘米,高度是115.15厘米,一般在打印照片等情况下。
日常讲分辨率时其实可以指很多情况,一般指图像宽度x高度,如,指水平上有2448个像素,垂直上有3264个像素。
压缩算法概念
一个名称为Joint Photographic Experts Group的组织,也是一种压缩算法。JPEG本身只有描述如何将一个视频转换为字节的数据流(streaming),但并没有说明这些字节如何在任何特定的存储媒体上被封存起来。JPEG有有损压缩和无损压缩,无损压缩的没有得到什么支持,所以一般讲JPEG指它的有损压缩。
JPEG File Interchange Format,JPEG文件交换格式,详细说明如何从一个JPEG流,产出一个适合于电脑存储和传输的文件。一般后缀有.jpeg、.jpg、.jfif以及.jif。
又称栅格图,是使用像素阵列来表示的图像。非压缩格式,从左往右从上往下扫描,占用较大存储空间。
微信图片处理规律
经过简单测试发现,在微信,A发一张原图给B时,B直接保存缩略图:
iOS版的微信保存下来是等比例压缩高度为800,质量80。
Android版的微信保存下来是等比例压缩高度为1280,质量80。
朋友圈的图片保存下来,都是等比例到高1280像素,质量和大小还没找到规律。
为什么微信是取高固定而不是宽呢?可以思考下。
Base64编码后大小
我们现在还用着Base64编码图像数据,后面需改成提交表单方式。
Base64要求把每三个8Bit的字节转换为四个6Bit的字节(38 = 46 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。
iOS的pt与Android的sp
我在文章里讲了iOS设备的pt和px关系。
iOS的pt是开发单位,一个逻辑point对应一个点dot。@1x设备上一个pt上显示1个px(像素),@2x上一个pt显示2个px,@3x上显示3个px。平时在storyboard上设置时指的都是pt。
Android的sp一种基于屏幕密度的抽象单位。
Android图片质量会比iPhone的差?
在、、三篇文章中讲了Android系统在压缩上的一些不为人知的问题。
大致是,Android编码保存图片就是通过Java层函数——Native层函数——Skia库函数——对应第三方库函数(例如libjpeg),这一层层调用做到的。 libjpeg在压缩图像时,有一个参数叫optimize_coding,如果设置optimize_coding为TRUE,将会使得压缩图像过程中基于图像数据计算哈弗曼表,由于这个计算会显著消耗空间和时间,默认值被设置为FALSE。对于当时的计算设备来说,空间和时间的消耗可能是显著的,但到今天,这似乎不应再是问题。但谷歌的Skia项目工程师们对optimize_coding在Skia中默认的等于了FALSE,这就意味着更差的图片质量和更大的图片文件。还有其他和iOS的比较可以看下。
也讲到了Android可以替换libjpeg库达到设置为TRUE的目的。
iOS的UIImage保存图片问题
起初发现压缩后保存图片,不同压缩质量系数,得出来的文件大小趋势和计算出的大小趋势不同,所以怀疑使用NSData初始化UIImage时多做了什么。
NSData *imageData06 = UIImageJPEGRepresentation(scaledImage, 0.6);
UIImage *image06 = [UIImage imageWithData:imageData06];
UIImageWriteToSavedPhotosAlbum(image06, nil, nil, nil);
通过软件发现,不同压缩质量系数,得出来的NSData保存成UIImage图片,看到的质量都是92,按道理应该是对应的质量系数才对。于是想将NSData保存成文件到目录,读取出文件大小。
NSString *documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *filePath = [documents stringByAppendingPathComponent:@"image.jpg"];
NSData *imageData = UIImageJPEGRepresentation(image, 0.7);
NSError *error =
[imageData writeToFile:filePath options:NSDataWritingAtomic error:&error];
if (error != nil) {
NSLog(@"error = %@", error);
NSLog(@"success");
NSLog(@"imageData = %u", (unsigned)imageData.length);
NSFileManager* manager = [NSFileManager defaultManager];
if ([manager fileExistsAtPath:filePath]){
unsigned long long size = [[manager attributesOfItemAtPath:filePath error:nil] fileSize];
NSLog(@"0.7后文件大小 %llu", size);
UIImage *imageFromData = [UIImage imageWithData:imageData];
UIImageWriteToSavedPhotosAlbum(imageFromData, nil, nil, nil);
UIImage *imageRead = [[UIImage alloc] initWithContentsOfFile:filePath];
UIImageWriteToSavedPhotosAlbum(imageRead, nil, nil, nil);
读取文件大小size和NSData大小imageData.length打印一致,而与imageRead、imageFromData的大小不一样,因此可以证明UIImage这个对象本身还做了其他事情。
在这篇文章的截图显示,UIImage的imageWithData方法堆栈显示还调用了哈夫曼解码。
压缩再压缩做了什么
首先谈下看图软件怎么展示图片。打开.jpg图片时,看图软件将文件转换成位图才显示出来,即把量化表矩阵与基本转化矩阵运算得出图片当前的位图(因为经过了压缩,所以该位图与原位图不同)。
压缩后再压缩也是,先将图片变回位图,再将位图按现在的压缩质量系数压缩。
所以压缩后的图片有可能变大,我猜测原因是,压缩前的占用空间压缩率较大,而再压缩时选的质量系数较大,导致压缩占用空间率(即压缩的第二步)较小,所以导致质量其实是变差了,但是占用空间反而可能变大。
变大的例子如:本来图片A大小500KB,压缩质量系数选择0.7,得到B图片90KB,再拿这张B图片去压,压缩质量系数1.0,得出C图片。前面我们说压缩不仅压缩质量,还压缩占用空间。如果第一次压缩的压缩质量比例跟第二次压缩的比例的差值,比第一次压缩的压缩占用空间比例跟第二次的压缩占用空间比例的差值小,那么C图片就会比B图片大。因为虽然C图片质量比B图片质量差点,但是B图片的空间压缩得比C图片大比较多。
欢迎到我的博客交流:
A Programmer Who Wants To Be A Poet . ——尘世间一件迷途小码农
37 视频滤镜 在配置编译FFmpeg时可以通过--disable-filters来禁止所有滤镜的编译。也可以配置编译脚本来输出所有包含进编译的滤镜信息。 下面是当前可用的视频滤镜介绍。 alphaextract 把输入视频作为灰度视频来提取透明通道,它通常和alphame...
问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补丁和内补丁不同问题症状:随便写几个标签,不加样式控制的情况下,各自的margin 和padding差异较大。碰到频率:100%解决方案:CSS里 {margin...
版本记录 前言 只要是做图片的或者与图片相关的,那么图片的格式就是一个不可以绕过的问题,我们见过很多的图片格式,但是具体不同的图片格式是如何定义的,又具有什么特点,很多时候我们都没有深入研究过,下面我们就开始深入研究。感兴趣的可以看我上面这篇。1. PNG、JPEG、BMP...
非原创,只是整理,如果里面发现引用的内容没有标识出来,欢迎指出。 一、基本知识 (1)两种图片: 1)矢量图: 矢量图又叫向量图,是用一系列计算机指令来描述和记录一幅图,一幅图可以解为一系列由点、线、面等到组成的子图,它所记录的是对象的几何形状、线条粗细和色彩等。生成的矢量...
LZ-Says:小沈阳版程序员~~~程序员其实可痛苦的了......需求一做一改,一个月就过去了;嚎~需求再一改一调,一季度就过去了;嚎~程序员最痛苦的事儿是啥,知道不?就是,程序没做完,需求又改了;程序员最最痛苦的事儿是啥,知道不? 就是,系统好不容易做完了,方案全改了;...
好久没写了,主要是人懒了,一有时间就玩手机~过去几天,经历了低谷,各种面试的失败,让我已经有了无力感。想找各种人说说话!而且谭轲加了我,时隔三年的第一次对话,我觉得我把他当做自己的亲人,别无他感。我也不要脸地问他要月饼,其实我真的觉得没啥的~今天竞选班长,其实之前很纠结,因...
围墙上有猫 巷道旁边有花 风把斜挎书包骑自行车放学的男孩 白色衬衫吹鼓起来 只想去这种小地方
人在过往和经历中会体会到成功和失败的过程,从过程中会了解自己,发现自己的优点和不足,发现这样的自己才能接受这样的自己。
早晨五点半起床吃早餐,然后赶往青龙峡,汽车沿着山路盘旋,一路颠簸,弄得一些晕车的老人与小孩呕吐不止! 到了入口,我和老公因带有小孩只能选择做索道去峡谷,第一次做索道不免感到有些惊恐,但稍微稳定情绪倒觉得是一种美的享受!清晨七八点钟山中的晨雾还未完全消退,我们沉浸在大幅水墨画...

我要回帖

更多关于 微信文件传输助手压缩 的文章

 

随机推荐