[转] 为何图片经过OSS缩略之后尺寸变大了?

摘要:OSS提供了基本的图片处理功能和图片格式之间的转换功能,在实际使用过程中,很多用户使用OSS将原图缩略之后输出,在这个过程中也出现了很多用户询问为何缩略之后图片尺寸变大,本文主要通过一些示例解释了这种现象出现的原因和排查方法。

简介

OSS提供了基本的图片处理功能和图片格式之间的转换功能,在实际使用过程中,很多用户使用OSS将原图缩略之后输出,在这个过程中也出现了很多用户询问为何缩略之后图片尺寸变大,如这个例子:

原图:http://batchtest.oss-cn-hangzhou.aliyuncs.com/example1.png

处理之后:http://batchtest.oss-cn-hangzhou.aliyuncs.com/example1.png?x-oss-process=image/resize,w_600

原图经过OSS从640x427 缩放到 600x400之后size反而变大了很多,这是为什么呢?

下面我们结合不同图片格式的一些特点分析一下为什么会出现这样的情况。

格式对比

图片目前是一种多种编码格式并存的情况。目前在网络上广泛使用的主流格式有JPEG、PNG和WEBP三种,其他的类似BMP、GIF、TIFF等使用较少,这里暂时不讨论。

JPEG作为一种最常见的图片格式,出现的最早,几乎已经成为网络上的标准格式。但是在实际使用上有一个最大的问题,那就是不支持透明通道。

PNG是一种无损压缩的图片格式,最大的优势是支持模式多,可以支持RGB、灰度、索引等各种格式,同时可以自由选择叠加透明通道或者指定透明背景颜色,因此在图片质量要求较高的时候或者需要支持透明通道的时候PNG是最好的选择。

WEBP是Google大力推广的一种图片格式。WEBP作为一种现代图片格式,不仅运用了很多新的压缩方式,达到在同等效果下比JPEG减小很多尺寸,而且支持透明通道、无损压缩等之前只有PNG才支持的一些特性,因此在很多方面也得到了广泛的运用。

三种格式的功能对比如下:

image.png

尺寸影响因素

对于同一张片来说,使用JPEG和WEBP,尺寸影响因素除了图片长宽之外,最主要就是压缩的质量参数。但是对于PNG来说,影响的因素非常多。

PNG的是无损压缩,基本原理是首先对图片使用差分编码,然后对编码之后的数据使用LZ77+Huffman编码进行压缩。因此PNG图片的大小受到以下这些因素的影响:

  • 图片内容:因为重复性内容多的PNG图片会导致无法充分的压缩,因此文件大小会很大。
  • 位深:PNG支持16bit和8bit的类型。
  • 色彩空间:PNG支持24bit的真彩色、8bit的灰度、8bit的索引图像等类型,因此视觉效果相同的图片文件大小会非常悬殊。
  • 透明通道:带透明通道的PNG图片会比不带的多出很多像素,另外,如果仅仅指定透明背景色对图片文件大小几乎无影响。

下面会用结合实际遇到的一些例子来说明这些因素如何影响图片文件大小。

例子1

首先我们分析最开头遇到的这个例子。

原图:http://batchtest.oss-cn-hangzhou.aliyuncs.com/example1.png

处理之后:http://batchtest.oss-cn-hangzhou.aliyuncs.com/example1.png?x-oss-process=image/resize,w_600

可见原图大小为127K,缩放之后为335K。

这种问题调查首先要确定原图和缩放之后的一些详细信息,这里我们使用ImageMagicK这个工具集中的identify命令来查看对应的信息。工具官网见https://www.imagemagick.org/script/index.php

这里使用的命令是identify -verbose xxx.png。

原图的信息为:

 Format: PNG (Portable Network Graphics)
  Mime type: image/png
  Class: PseudoClass
  Geometry: 640x427+0+0
  Units: Undefined
  Type: Palette
  Endianess: Undefined
  Colorspace: sRGB
  Depth: 8-bit
  Channel depth:
    red: 8-bit
    green: 8-bit
    blue: 8-bit

再看处理之后的图片信息:

Format: PNG (Portable Network Graphics)
  Mime type: image/png
  Class: DirectClass
  Geometry: 600x400+0+0
  Units: Undefined
  Type: TrueColor
  Endianess: Undefined
  Colorspace: sRGB
  Depth: 8-bit
  Channel depth:
    red: 8-bit
    green: 8-bit
    blue: 8-bit

这里可以看出区别,那就是原图的Type为Palette,处理之后的图片为TrueColor,这就是最大的差别,因为原图为索引类型,处理之后的图片为RGB真彩色,因此需要编码的像素点个数是索引类型的三倍,因此导致图片变大。

这种类型是最常见的图片变大的原因,造成一种原因一个很重要的因素是使用了PNG优化工具如ImageAlpha等,这些工具会将真彩色的PNG图片降采样到256种颜色然后压缩成索引类型以减少图片大小,这是一个有损的过程。但是在缩放过程中,缩略的过程会根据原像素计算出新的像素值,因此缩放算法会导致结果图片生成的颜色数目超过256种从而无法压缩成索引图像。

为了确定这一点,我们也可以使用identify工具来查看颜色数目:

$ identify -verbose -unique http://batchtest.oss-cn-hangzhou.aliyuncs.com/example1.png?x-oss-process=image/resize,w_600  |grep Colors
  Colorspace: sRGB
  Colors: 27080
$ identify -verbose -unique http://batchtest.oss-cn-hangzhou.aliyuncs.com/example1.png  |grep Colors
  Colorspace: sRGB
  Colors: 256

可见颜色数目由256增长到了27080个。

例子2

原图:http://batchtest.oss-cn-hangzhou.aliyuncs.com/example2.png

处理之后:http://batchtest.oss-cn-hangzhou.aliyuncs.com/example2.png?x-oss-process=image/resize,w_600

原图大小为283K,处理之后大小为335K。

首先还是按照上面一个例子的方法,检查一下图片格式信息。

这是原图的:

  Format: PNG (Portable Network Graphics)
  Mime type: image/png
  Class: DirectClass
  Geometry: 640x427+0+0
  Units: Undefined
  Type: Palette
  Endianess: Undefined
  Colorspace: sRGB
  Depth: 8-bit
  Channel depth:
    red: 8-bit
    green: 8-bit
    blue: 8-bit

这是处理之后的结果:

  Format: PNG (Portable Network Graphics)
  Mime type: image/png
  Class: DirectClass
  Geometry: 600x400+0+0
  Units: Undefined
  Type: TrueColor
  Endianess: Undefined
  Colorspace: sRGB
  Depth: 8-bit
  Channel depth:
    red: 8-bit
    green: 8-bit
    blue: 8-bit

可见,两者的压缩类型是完全一致的,那是什么原因导致的问题呢?

这里需要使用另外一个工具,pngthermal,链接见https://encode.ru/threads/1725-pngthermal-pseudo-thermal-view-of-PNG-compression-efficiency

这个工具主要的功能是将PNG图片不同部分的压缩率使用可视化的方式展现出来,亮度越高的地方压缩率越低,我们针对两张图片用该工具分析的结果如下,上为原图,下为处理后图片:


image.png
image.png

可见同样视觉效果的图片,压缩率差别很大,说明处理前的图片细节上重复较多,一般来说都是由于颜色数目导致的。为了确定这一点,使用上个例子的工具检查颜色数目,可以同样确定原图为256种颜色,处理后变成了27080种颜色。

其实本示例中的原图就是上一个例子的原图强制转换为RGB真彩色空间之后生成的。因为颜色只有256种,因此可供压缩的重复性信息较多,导致了处理后的图片比原图还大。

实际应用中,有很多美工生成的素材图片使用的颜色并不多,因此导致压缩率比较高,缩放之后就会出现类似的情况。

例子3

原图:http://batchtest.oss-cn-hangzhou.aliyuncs.com/example3.png

处理之后:http://batchtest.oss-cn-hangzhou.aliyuncs.com/example3.png?x-oss-process=image/format,webp

这里的示例是一个PNG转WEBP,原图大小为760字节,处理之后变成了1.3K。

首先还是使用identify工具查看两者的差别。

这是原图的:

  Format: PNG (Portable Network Graphics)
  Mime type: image/png
  Class: DirectClass
  Geometry: 92x34+0+0
  Units: Undefined
  Type: GrayscaleAlpha
  Endianess: Undefined
  Colorspace: sRGB
  Depth: 8-bit
  Channel depth:
    gray: 8-bit
    alpha: 8-bit

这是处理之后的:

  Format: PAM (Common 2-dimensional bitmap format)
  Mime type: image/x-portable-pixmap
  Class: DirectClass
  Geometry: 92x34+0+0
  Units: Undefined
  Type: PaletteAlpha
  Base type: TrueColor
  Endianess: Undefined
  Colorspace: sRGB
  Depth: 8-bit
  Channel depth:
    red: 8-bit
    green: 8-bit
    blue: 8-bit
    alpha: 8-bit

这里可以看出一个非常明显的区别,原图是灰度图带上了透明通道,而处理之后的图片是RGB再带上透明通道。

原因是Webp并不支持灰度图带上透明通道这种类型,带上透明通道就将格式固定成了RGBA格式。因此导致了要保存的数据变大。

总结

从上文的例子可以看出,影响图片文件大小的因素很多,这里仅简单的列举了几个在应用中经常遇到的因素。

  • 例子1:索引类型PNG缩略之后变成RGB类型PNG,像素增多导致文件变大。
  • 例子2:颜色数目较小的PNG图片缩略之后颜色数目变多,压缩率下降导致文件变大。
  • 例子3:带透明通道的灰度PNG转换成WEBP之后变成RGBA格式,像素增多导致文件变大。

可以看到大部分和预期结果不符合的都是PNG格式的图片。

一般来说,同样视觉效果的图片文件大小,webp<jpeg<png。但是PNG支持的编码类型非常的灵活,可以根据实际应用的需求自由调整,网上也有很多优化PNG图片大小的工具,因此往往出现图片处理之后破坏了优化效果,导致处理之后反而文件变大的情况。因此这里建议使用PNG图片上有体积大小要求的场景把体积优化放在最后一步,最好保存多份不同分辨率的PNG素材以供调用,不要对图片处理之后的图片文件大小有强预期。如果碰到了图片文件大小上的问题,也可以使用本文介绍的工具自己手动进行分析。

这里最后再补充一个Google给出的图片使用格式的建议作为结束:

image.png

文章出处:https://yq.aliyun.com/articles/74634

另:

JPG转PNG文件大小通常会增加5倍以上,这是因为JPG是有损压缩,而PNG是无损压缩。JPG转为PNG图片的质量不会有变化,但大小会增加很多;而PNG转JPG,会损失掉透明的部分(因为JPG不支持图片的透明),但文件大小会减少很多,根据不同的压缩比,可以达到10倍的压缩比。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349