有什么压缩方法适合压缩重复图片
大概需求是这样 有一批图片 基本上99%的像素都是一样的 重复率很高 因为占用空间还蛮大的 想知道有没有办法压缩要求就是不改变已有图片的质量 试了下打成tar包大小基本没变 有什么别的工具适合这个场景?7z啊 各种CG包都是7z压的 只是打成tar当然没变了,tar.gz后面那个.gz可不是吃干饭的。
如果一般压缩效果不好的话不妨试试把图片存成bmp这样的不自带压缩的格式再上tar.gz(或者7z/rar/pkzip之类的应该也都可以) 7Z压缩级别选高一些就可以,7z默认压缩级别对重复的jpg几乎无处理,手动选到最大或者极限压缩就有效果了。 原图片是什么格式? 7z,记得GALGAME的图包可以压缩到小得惊人 ____是________的唯一标准。
这个问题看着很有意思的样子,我拿个例子试一下。
我们使用的材料是这个:
从SIF里面弄出来的立绘,可以说是比较符合“重复图片”这一标准了。
【对照组】
那些图片一共460张,1024x1024,PNG格式,因为是立绘所以有Alpha通道,共59.4MB。
【实验组1】
首先试试直接拿7z压缩,参数如图所示:
7z压缩包的大小是49.9MB,完全不行。
如果用tar.gz压缩,大小是56.2MB,更加不行。
【实验组2】
把这些图片转成bmp,总大小变成了1.79GB(图片的Alpha通道会消失,这点比较讨厌),
然后再7z,文件的大小是13.9MB,好了很多。
如果用tar.gz的话,大小会是55.0MB,一夜回到解放前。
【实验组3】
把图片拼成一个大的PNG格式的sprite图。(Alpha通道不会消失了,可喜可贺)
每个图片的大小是1024x1024,拼成一个竖着的长图,就是1024x471040。
PNG长图的大小是72.6MB,还不如不压缩呢。
即使再7z也仍然有67.9MB,看来是凉了。
【实验组4】
把图片拼成一个大的BMP格式的sprite图,1.34GB,再把它7z。(Alpha通道又会消失了,真是不幸)
7z压缩包大小是13.3MB。
考虑到实验组2的情况,tar.gz就不试了。
【结果】
A. 对照组:59.4MB
B. 直接7z:49.9MB
C. 直接tar.gz:56.2MB
D. 转成BMP并7z:13.9MB
E. 转成BMP并tar.gz:55.0MB
F. 拼成PNG并7z:67.9MB
G. 拼成BMP并7z:13.3MB
【结论】
1. 7z搭配bmp超棒 (G)
2. 把图片拼到一张没有意义 (BF、DG)
3. 要把图片存成bmp (BD)
4. tar.gz就是个垃圾 (BC、DE)
如果你觉得有什么更好的方法欢迎回复。
xmcp 发表于 2018-2-7 00:42
这个问题看着很有意思的样子,我拿个例子试一下。
我们使用的材料是这个:
看起来很像是视频压缩要解决的问题…… 本帖最后由 烈之斩 于 2018-2-7 01:53 编辑
xmcp 发表于 2018-2-6 11:42
这个问题看着很有意思的样子,我拿个例子试一下。
我们使用的材料是这个:
之前研究过同样的问题,结论么自然是bmp+7z最好
https://files.catbox.moe/6zar7f.png
详情可以参见:https://fireattack.wordpress.com ... s-larger-file-size/
另外有一点当时没写,后来有试过哪怕是png无压缩(基本和bmp一个体积了)再7z效果都都远不如BMP,原理不明了 不对,记错了,是体积差不多,但是压缩bmp要比PNG快一倍
说起压缩,我下意识觉得,由于图像格式要考虑解码速度,7z的lzma之类通用数据压缩会比图像格式压缩率更高,刚拿了两张cg试了下,没想到webp lossless的最大压缩级别比7z lzma2极限压缩更小
https://i.loli.net/2018/02/07/5a7a39f17c581.png
左图
bmp: 5626 KB
7zip lzma2 x=9: 727 KB
webp lossless -z 9: 649 KB
7z压缩两张图后大小:760 KB
webp(右图-左图): 18.3 KB + webp(左图): 668 KB
于是对vp8有点震惊,于是尝试整个cg包用vp8的后续版本vp9 lossless打包成webm视频(28.5 MB),然而压缩率不如bmp->7z (19.7 MB)
我不是萝莉控,cg包是我刚刚为了测试才下的
当然是黄油cg包标配 bmp+7z 好专业的回复 我先慢慢爬楼 顺便补一句 图片是png, 需要先转成bmp吗 lwa190212 发表于 2018-2-6 18:56
说起压缩,我下意识觉得,由于图像格式要考虑解码速度,7z的lzma之类通用数据压缩会比图像格式压缩率更高, ...
视频压缩还要考虑次序以及流媒体支持(可以从(近似)任意位置开始解码,所以不能做到像固实压缩那样),肯定会有一定消耗 紧那罗 发表于 2018-2-7 08:36
好专业的回复 我先慢慢爬楼 顺便补一句 图片是png, 需要先转成bmp吗
看你的PNG有没有用到透明图层咯。如果确实有需求,也可以看看网上许多png本身的微劣化压缩工具…… 本帖最后由 lwa190212 于 2018-2-7 09:05 编辑
烈之斩 发表于 2018-2-7 08:38
视频压缩还要考虑次序以及流媒体支持(可以从(近似)任意位置开始解码,所以不能做到像固实压缩那样), ...
视频打包图片本来就不现实了,图片分辨率不一致就玩完
不过本身vp8就有很好的压缩率,包括在前面的测试里两张相似图片手动差分后压缩再加起来比7z压缩率更高,甚至两张图片的压缩后webp比7z的对比单张图片的压缩率还上升了
我还没理解的就是vp8lossless标准上用的也就是lz77,哈夫曼编码这些技术,为什么会比lzma2更强,是图像预测起了作用吗
lwa190212 发表于 2018-2-6 20:00
视频打包图片本来就不现实了,图片分辨率不一致就玩完
不过本身vp8就有很好的压缩率,包括在前面的测试里 ...
感觉用两张图很难说明什么,因为不同的文件类型差在不是只有算法部分,还有很多固定成本(文件头啊metadata啥的)在里面
可以试试几十张图至少
另外看了下webp lossless的specification,说是除了lz77和huffman还有什么“color cache”,可能也有关
感觉作为专门做图像压缩的,能打败lzma这种generic的算法倒也不算什么怪事? 试下Caesium? 调到98%或者100%看看... 烈之斩 发表于 2018-2-7 10:10
感觉用两张图很难说明什么,因为不同的文件类型差在不是只有算法部分,还有很多固定成本(文件头啊metada ...
因为整张图差分再分别用webp压缩这个方法本身就是比较烂的算法,用几十张图做差分肯定不会比混在一起做lzma高效的,7z似乎对不同格式的压缩策略会做调整,如果能在图像上使用vp8里的一些技术应该会有更高效率吧
我用另一波14张同一场景的图做了测试,7z直接压完是1,111,311 字节
差分后用webp压完1,098,118 字节,再对webp用7z压竟然还能压到966,683 字节,掺入webp后多压了13% pgain2004 发表于 2018-2-7 08:44
看你的PNG有没有用到透明图层咯。如果确实有需求,也可以看看网上许多png本身的微劣化压缩工具…… ...
有alpha通道大不了转tiff再压… 用win10或windows server的deduplication是不是效果更好,不过会损失在其他系统的可读性 xmcp 发表于 2018-2-7 00:42
这个问题看着很有意思的样子,我拿个例子试一下。
我们使用的材料是这个:
试试把PNG另存不压缩的TIFF 秋雨灰灰 发表于 2018-2-7 11:52
用win10或windows server的deduplication是不是效果更好,不过会损失在其他系统的可读性 ...
windows10好像只有老版本才能安装
至少我的1703 1709是不行
http://myitworld.azurewebsites.net/2016/10/14/enable-deduplication-windows-10/
有谁测试过1607 1511嘛?
我也觉得最理想的情况下,deduplication首选 superchenxx02 发表于 2018-2-7 13:52
试试把PNG另存不压缩的TIFF
也是13.9MB。
反正Alpha通道不是0就是1,没什么信息量,所以跟BMP大小一样非常合理。 xmcp 发表于 2018-2-7 00:42
这个问题看着很有意思的样子,我拿个例子试一下。
我们使用的材料是这个:
32位的bmp有alpha通道哦 本帖最后由 lwa190212 于 2018-2-7 14:55 编辑
xmcp 发表于 2018-2-7 14:21
也是13.9MB。
反正Alpha通道不是0就是1,没什么信息量,所以跟BMP大小一样非常合理。 ...看错了
大佬,我刚才测试了两组eroCG,分别用bmp和未压缩,无交错的png经过7z极限压缩后,都是png的一组压缩率高(一点点),
cg没有alpha通道,虽然我觉得未压缩的png有没有alpha通道都不会影响结果
你刚才测试用的立绘能给个链接吗
https://github.com/schnaader/precomp-cpp
png的话,试试这个?原理好像是把png自带的压缩解压然后换用lzma,起码不用几种格式之间转换,不过要先将文件tar lwa190212 发表于 2018-2-7 01:44
大佬,我刚才测试了两组eroCG,分别用bmp和未压缩,无交错的png经过7z极限压缩后,都是png的一组压缩率高( ...
png无压缩不是和bmp没啥区别么,体积差不多很正常吧
但是你注意观察一下,压缩bmp比PNG无压缩至少快一倍
烈之斩 发表于 2018-2-7 14:51
png无压缩不是和bmp没啥区别么,体积差不多很正常吧
但是你注意观察一下,压缩bmp比PNG无压缩至少快一倍 ...
刚把你发的贴和前面一位大佬发的贴搞混了以为第一位的实验符合你说的“后来有试过哪怕是png无压缩(基本和bmp一个体积了)再7z效果都都远不如BMP,原理不明了”
没区别就没问题了 lwa190212 发表于 2018-2-7 01:58
刚把你发的贴和前面一位大佬发的贴搞混了以为第一位的实验符合你说的“后来有试过哪怕是png无压缩 ...
抱歉,我就感觉你是不是在回我…
我刚修改了前面的,是我之前记错了,不是体积有差别,是压缩速度有差别,直接压缩png无压缩巨慢
而且bmp也支持alpha通道其实(不过有些软件读取不出来),所以我都用bmp了包括立绘 烈之斩 发表于 2018-2-7 15:00
抱歉,我就感觉你是不是在回我…
我刚修改了前面的,是我之前记错了,不是体积有差别,是压缩速度有差别 ...
才知道bmp也可以带alpha
那么,有什么现成的工具可以把带alpha的图像转为alpha的bmp的吗?
话说bmp的alpha是8bit的还是1bit? lwa190212 发表于 2018-2-7 02:19
才知道bmp也可以带alpha
那么,有什么现成的工具可以把带alpha的图像转为alpha的bmp的吗?
话说bmp ...
我用xnview转的,就直接选bmp就行,alpha保留,8bit
烈之斩 发表于 2018-2-7 15:39
我用xnview转的,就直接选bmp就行,alpha保留,8bit
多谢 本帖最后由 余生皆假期 于 2018-2-8 13:08 编辑
直接压缩显然是不对的,对于重复率较高的图片,有着更好的压缩方法。
对于无损压缩,目前主流的压缩算法 lzss, lzw 及其变体等,等于文本处理效果显著,对于图像处理却十分勉强。
对于重复率较高的图片,考虑以下方案:
假设目前有两张相似的图片 A, B。
1.将 B 划分为 8*8 的图块,在 A 中查找最相似的图块的坐标,例如对于 B 中一个坐标(8, 8)的图块,在 A 中搜索 x(0-15), y(0-15) 的范围。
比较图块的相似度有很多种算法(SAD, SSD等),这里我们用 SAD 计算【图块中【每个像素的差的绝对值】的和】。
我们给搜索加上一个终止条件,比如误差小于 200 就认为搜索到了而不必一定要找到最小误差。
这样我们可以得到一个数组,表示图像 B 的所有图块信息,数组中每个元素是一个保存了一份图块信息的字典:
{
'x': 0, // 图块在 A 中的坐标
'y': 0, // 同上
}
暂且将这个文件以 json 格式保存为 B.json。
2.以 A 为参照,对 B.json 进行还原,还原以后会生成一个充满马赛克的图片 B1,计算 B 和 B1 的差值,生成图片 B2。
现在,我们可以通过 B.json + B2 + A,还原出无损的图片 B,看起来,相对于之前的 B + A,不但没有减少文件体积,反而还多了一个 B.json。
然而需要注意的是,差值图 B2 是存在大量重复数据的,因此可以用压缩算法进行压缩,同样的,B.json 也可以直接优化为自定义的二进制格式(例如 x, y 仅用 4 字节存储),所以文件体积反而变小了。
3.对于图片 A, B, C,以同样方法压缩,A 为关键图,其余每张图以上一张图为参照进行还原。
4.将所有数据整合为一个自定义格式的文件后进行压缩。
这其实就是视频压缩的原理,以上仅仅只是一个非常朴素的编码方案,目前主流算法例如 H.264 要先进得多,即便如此,这个方案也比直接压缩效率要高。(我做 galgame CG包时测试过)
结论:楼主用关键帧/临近帧处理把图片压缩最优。
ps:刚刚又测试了一下,这个方案还是略优的,素材是万华镜CG包。
本帖最后由 mozilla 于 2018-2-7 21:24 编辑
烈之斩 发表于 2018-2-7 15:39
我用xnview转的,就直接选bmp就行,alpha保留,8bit
bmp格式版本很多,https://en.wikipedia.org/wiki/BMP_file_format有说明Alpha有BITMAPV4HEADER或BITMAPV5HEADER等区别,我记得win7的资源管理器至少不认其中一种。xnview我手上没有,不知道是处理成哪种。我的疑问在是否转换是无损的。
虽然你们都懂,但我看楼主可能不理解png、jpg等都是针对图片的压缩格式,不能对已压缩的再压缩,你们讨论“解压”为bmp是好主意,但有损解压再压缩就没意义了。
对了,利用视频压缩格式压图像很取巧,视频压缩天生针对重复图像,比7z之类通用压缩格式恐怕会好一些。 懂了,也就是说7z的压缩远胜图片压缩,所以尽量用未压缩的图片格式,如果先压了(如JPG、PNG),那压缩包就难以施展了。 简单讲
png已经做了大色块去重
再用7z这种大规模去重的算法,反效果了
不如直接原始的未大色块去重的,直接上7z
直接上视频类似的有临近帧/关键帧处理的,显然是好主意
-- 来自 能看大图的 Stage1官方 iOS客户端
页:
[1]
2