给定一个 100x100 的画布,制作一张占 K 数最大的图片

2014-07-24 16:13:11 +08:00
 hzlzh
突然想到一个小题,反向去推算固定尺寸图片的存储K数上限,大家什么思路?
例如:jpg png(除去额外的图片配色预设或软件信息)
4639 次点击
所在节点    程序员
27 条回复
est
2014-07-24 18:16:32 +08:00
不错的面试题
hzlzh
2014-07-24 19:11:29 +08:00
@66450146 设:结果是给机器验证的,排除人的视觉主观感受。
jedyu
2014-07-24 19:14:48 +08:00
文件尾可以塞无限数据
hzlzh
2014-07-24 19:24:55 +08:00
@jedyu 不要作弊哟
learnshare
2014-07-24 19:26:54 +08:00
@iscraft 我没有什么图像处理方面的编程经验,更别谈读过压缩算法了...

我认为使画质降低的处理(有损压缩),应该是为了达到我在 #16 谈到的两个条件。比如有两个相邻的像素,颜色比较接近,就可以优化成同一个颜色。(用 PS 做过径向过渡效果的同学,应该会发现导出的图如果质量不高的话,就会有波纹状效果)

当然,@66450146 谈到的这种针对视觉效果的处理,就更复杂了。
icyalala
2014-07-25 00:16:24 +08:00
这个主要是涉及信息论的"熵"的概念吧。。
知乎有个类似的问题,可以看一下: http://www.zhihu.com/question/22539777

针对LZ的问题,固定大小的图片,理论上如果其中的数据最无序(熵最大),那它的压缩比也应该是上最小的。

在具体到文件格式上:
-----------------------------
PNG格式是无损压缩,压缩算法是deflate,实际上就是用Haffman编码来压缩,符合信息熵的理论,那最简单的方法就是每个像素都用随机数填充,随机数函数质量越好,熵越大。

简单做个实验:
BMP文件用这个生成:https://github.com/esneider/bmp
随机数是从设备的噪声数据熵池中取的:http://zh.wikipedia.org/wiki//dev/random
生成一张100x100 24bit的bmp文件,大小是30KB。

这张是手动填写的数据,虽然没有相同颜色的像素,但是数据比较有序。压缩成PNG后只有6KB。


这张是用随机数填充的,压缩成PNG后有32KB(几乎没有压缩效果)。


如果非要精确的生成一张理论压缩比最小的PNG,可以尝试看下PNG的压缩过程,针对实际算法来一步步填充。

-----------------------------
JPG格式是有损压缩,所以要先看一下这个压缩算法。JPG是用人类的视觉模型来进行压缩的,颜色模型是YCbCr,所以BMP转JPG时,第一步要把RGB颜色转换为YCbCr,然后再用离散余弦变换转换到频域,之后可以压缩掉一些频域上人眼不敏感的数据,最后才用Haffman编码来处理数据。

这个过程来说,根据视觉模型压缩这一步不好分析。。生成一个"最小压缩比"的图片,理论上很困难。。感觉。。
luo362722353
2014-07-25 01:06:12 +08:00
raw格式图片才是不压缩的...
你可以试试

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/124306

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX