CCR
1
如题,刚刚看到了 https://meta.appinn.net/t/topic/64917?u=ccr 这个帖子,里面提到了通过实验性压缩控制图片压缩后大小的办法,正好我也有个极其久远的相同需求 https://github.com/Mikachu2333/rimage_gui/issues/21 ,但是一直限于思路未能实现(我也是实验性压缩这个思路)
问题是我用于测试的部分图片极大,且像素分布极为不均(想象一张4分的图片,其左上与右下空白,其余部分是颜色混杂的10000×40000px的图片)
这让参数实验变得几乎不可能(长时间的高cpu占用、超大的实验文件、超长的压缩时间,图片颜色不均一导致无法通过取样的方式测试压缩)
大家有啥想法吗……
Seamee
(Seamee)
2
我记得几个月前发过这个,可以指定压缩后文件大小,小于此值就忽略,只有大于设定值的才会压缩
提供邪招一个:
压缩比调最大, 压到最小, 然后文件末尾填0
不考虑像素多少, 也不考虑质量的话
5 个赞
在 Linux 上测试,这个方法是可行的。
操作:用如下命令,向图片文件尾写入适量随机数据
cat /dev/random | head -n 10000 >> test.png
注:
cat /dev/random |head -n 1000
:输出 1000 行随机数据
>> test.png
将随机数据追加到图片文件 test.png
尾部
jpegoptim 可以指定压缩图片的大小。
例如,将 test.jpg
压缩到 1024 kb:
jpegoptim --size=1024kb test.jpg
1 个赞
Nigh
(xianii)
6
现有的常用图片压缩算法理论上不可能在不知道内容的前提下就能使用合适的参数将图片压缩到指定的大小。
对于题主的需求,我能想到的一个可行的方案是使用jpeg格式,先得到低压缩率的图形,然后逐步从高频分量向低频裁切直到满足体积要求。
我一般是用ImageMagick( https://imagemagick.org/ )指定大小,就是在ImageMagick安装目录已被添加进环境变量的情况下通过命令提示符执行如下命令:
magick convert -define jpeg:extent=1000k raw.jpg compressed.jpg
需要注意的是,成功执行后,生成的compressed.jpg并不是正好1000 KB,一般都是小于1000 KB的。想更深入了解的话,可以看 Common Formats -- ImageMagick Examples 。
Niceb
(Niceb)
8
现在的算法可以计算出压缩后的大小吗? 先计算,如何合适的话再实际压缩?
IrfanView 在保存某些图片格式时就有这样的选项
可以,但是需要精确计算,其所需的算力相当于压缩一遍…很明显这没意义
想到一个办法,主要利用随机原则
1,对照片中的像素进行随机抽样(而非压缩)得到一张缩略图
2,以不同的压缩程度压缩这张缩略图,以此来估计不同压缩程度下压缩原图所得的结果大小
3,我们可得到预期结果大小所需压缩程度在某两个数值的区间内
4,回到1,获取更大的缩略图,继续逼近更精确的压缩程度
注意,这里可以设定一个数值,例如超时时间。超时后,在当前压缩程度的区间内取较小值,执行压缩,然后给尾部填0即可
这样在在耗时可控、结果大小绝对精确的前提下尽可能保证了结果的清晰
Niceb
(Niceb)
12
大致看了一下jpeg压缩算法,发现控制压缩比例的是量化表
在 DCT 变化后,舍弃高频区数据的过程称为量化。有两份量化表可供选择,分别为亮度量化表和色度量化表:
上表分别为亮度量化表和色彩量化表,表示 50% 的图像质量。这两张表中的数据基于人眼对不同频率的敏感程度制定。
量化表是控制 JPEG 压缩比的关键,可以根据输出图片的质量来自定义量化表,通常自定义量化表与标准量化表呈比例关系,表中数字越大则质量越低,压缩率越高。PhotoShop 有12张量化表。
感觉是可以通过收集量化表,记录每种量化的压缩比,然后通过计算之后选择合适的量化表进行压缩。
更进一步可以收集更多的算法或压缩参数及对应的压缩比
https://zhuanlan.zhihu.com/p/40356456
https://developer.aliyun.com/article/578161
CCR
13
哎,看了大家的回答发现最简单的保大还是实验法,使用算法进行估计的话,算法必须完善,否则无法应对各种奇怪的图片……
感觉几乎无解啊
hzhbest
(天平那方重力异常)
14
视频压缩能够指定比特率,实际出来的也只是确保平均比特率在指定水平附近,不同视频片段的比特率其实是浮动的;音频倒有固定比特率,因为音频的复杂度低一个维度。
图片想指定大小,顶多只能指定期望大小然后根据量表输出期望大小附近的图片,或者通过尝试逼近的方式试出最接近期望大小的压缩比。
(引用原链接标题)有没有可能给出设定图片大小的选项,比如不超过500K
如果看楼主原贴的话,指定大小其实是指定图片体积(size)上限,既然有上限那可以用上限的七成或者八成作期望大小去压缩,或者按上限是图片原始体积的百分比来设定压缩质量百分比进行尝试。
按这思路写成程序,对第一幅图片测试两三次,按体积是否超/小去下/上调百分比,得出较佳压缩质量百分比后,后续的图片都按此标准执行,但检查是否体积超标,个别超标的临时下调十个百分点再压,累计多个图片超标后将标准下调或对超标最多的图片再次进行测试取得新标准;当然也可以将标准从压缩质量百分比改为压缩质量百分比与上限/体积比的比例(语言有点绕),可能更精确点。
但
对于一些几亿像素的图片,体积几十兆起步,不如先考虑缩小尺寸(dimension),像素太高除非纯色否则压不到,例如普通JPG格式千万像素体积约一至十兆,百万像素几百K至一兆。
——
即使是纯色,一亿像素图片,画图出JPG要1.49MB,85%JPG压缩后是1.11MG,就算是PNG也要309KB(甚至我在其中点了一个像素的其他颜色,也不影响其体积)。