半肾
精华
|
战斗力 鹅
|
回帖 0
注册时间 2019-8-30
|
本帖最后由 冰箱研会长 于 2020-8-15 08:26 编辑
2020年7月25日
目前在最新版本的配置文件中, ffmpeg和mp4box已经被舍弃.
目前脚本采用Libvips(需要hevc)模块.
(2020年8月15日: 我又给改回去了, 配置文件里的LIBVIPS被注释了, 想用vips就关闭注释然后注释同名函数就可以了)
具体如何安装可见第二集.
2020年5月13日08点33分
更新回复中推荐的MM+heic插件:
链接:https://pan.baidu.com/s/1oPMqm1btNujXvbxoM7V0UA
游客,本帖隐藏的内容需要积分高于 9000 才可浏览,您当前积分为 0
--------------
2020年5月8日16点46分
脚本已经完全并行化 处理速度大涨 使用方法没有改变 具体可见github
------------
2020年5月7日19点41分更新
有一个地方搞错了 只要安装imagemagick 你就会自动获得一份ffmpeg
所以ffmpeg不需要额外安装了
-------------
2020年5月6日
我的配置文件:
https://github.com/GrandArth/Risi-Pwsh-Profile
----
2020年5月6日14点00分 更新色彩空间科普
----------
2020年5月5日07点01分 感谢捉虫
-----------
2020年5月4日18点57分
感谢回复提到的yuv420隔行采样的问题
如果是彩**片 这里应该使用yuv444达到彻底无损的转码
然而444采样我在win10上找不到任何支持的软件
事实上420的10bit模式就已经让一堆软件阵亡了
但是苹果手机 无论是对444-10 还是 444-8 还是420-10 都可以正常解码.
这里就仅仅推荐IOS用户采用如下参数:
- #for yuv444 and yuv44410le use following code
- #8-bit yuv444
- ffmpeg -i $_.FullName -crf $crfval -pix_fmt yuv444p -sws_flags spline+accurate_rnd+full_chroma_int -color_range 1 -colorspace 5 -color_primaries 5 -color_trc 6 -f hevc "$($_.Directory)\$($_.Basename).hvc";
- #10-bit yuv444
- ffmpeg -i $_.FullName -crf $crfval -pix_fmt yuv444p10le -sws_flags spline+accurate_rnd+full_chroma_int -vf "colormatrix=bt470bg:bt709" -color_range 1 -colorspace 1 -color_primaries 1 -color_trc 1 -f hevc "$($_.Directory)\$($_.Basename).hvc";
复制代码
当然.. 这里我们说的是彩**片的无损转码 如果是你是黑白图片的话就没有什么可担心的
----------------------------
2020年5月4日09点44分 新增对比包
mlgb的 我截了一堆对比图 tm的不小心安了个退格, 退到了第一节 写的东西全没了.
这里就放个结论吧:
文件在这里:https://send.firefox.com/download/e8f68ffe9bcd7b9f/#OMlIB0ImvlTPpU5ktRyZOg
crf设置为0的时候已经可以正常压缩jpg 减小的体积占5%左右
crf设置为10的时候 体积已经可以稳定减少50% 2000%很难找到色块变化
同时webp设置为无损和85%的时候 体积不减反增 找不到明显的色块变化
crf20 和webp 45%的时候 二者体积均下降到原来的1/4上下 可以看到低频区相比原图有明显的高频损失
crf30的时候 体积已经是原来的1/10, 高频信息少量丢失
之所以会有这样的差别 说白还是webp编码支持的预测模式比较少, 就算放宽一点质量参数, vp8预测不了只能直接压缩的部分很可能仍然不满足条件, 只能直接压缩.
而hevc的预测模式那么多, 条件稍微放宽一点, 就有大量的色块可以被准确预测, 自然在压缩率上表现比较好.
----------------
可能是最后一次更新 20点58分
整合了所有题外话里面的优化的最终版本imgconv函数 + 仅仅使用ffmpeg实现编码的fimgconv(高速的代价是你也许会损失边缘的一列/行像素)
顺便优化了帧文件的删除
- #批量删除
- function mdel($tpath, $tformat){
- dir -recurse -path $tpath -include *.$tformat |%{
- $_.Delete();
- }
- }
- #普通版
- function imgconv($tpath, $quality,$sformat ,$tformat)
- {
- If($tformat -eq "heic")
- {
- dir -recurse -path $tpath -include *.$sformat |%{
- $extentmark = 0;
- $imwidth=magick identify -ping -format "%w" $_.FullName
- $imwidth=[int]$imwidth;
- If(($imwidth)%2 -ne 0)
- {
- $imwidth=$imwidth+1;
- $extentmark=1;
- }
- $imheight=magick identify -ping -format "%h" $_.FullName;
- $imheight=[int]$imheight;
- If(($imheight)%2 -ne 0)
- {
- $imheight=$imheight+1;
- $extentmark=1;
- }
- If($extentmark)
- {
- magick $_.FullName -gravity center -strip -extent "($imwidth)x($imheight)" -quality 100% $_.FullName;
- }
- }
- dir -recurse -path $tpath -include *.$sformat |%{
- $crfoffset = $quality * 10;
- $crfval= 30 - $crfoffset;
- ffmpeg -i $_.FullName -crf $crfval -pix_fmt yuv420p -sws_flags spline+accurate_rnd+full_chroma_int -color_range 1 -colorspace 5 -color_primaries 5 -color_trc 6 -f hevc "$($_.Directory)\$($_.Basename).hvc";
- MP4Box -add-image "$($_.Directory)\$($_.Basename).hvc:primary" -ab heic -new "$($_.Directory)\$($_.Basename).heic";
- }
- mdel $tpath hvc
- }
- Else
- {
- dir -recurse -path $tpath -include *.$sformat |%{
- $quality=[int]$quality;
- $magickquality=$quality * 100;
- #$magickquality="$magickquality"+"%";
- magick $_.FullName -quality $magickquality -interlace Plane -sampling-factor 4:2:0 -strip "$($_.Directory)\$($_.Basename).$tformat";
- }
- }
- }
- #图像分辨率有奇数的时候会损失一列/行像素的高速版
- function fimgconv($tpath, $quality,$sformat ,$tformat)
- {
- echo "This may delete one column/row of pixels!!!!!!!"
- If($tformat -eq "heic")
- {
- dir -recurse -path $tpath -include *.$sformat |%{
- $crfoffset = $quality * 10;
- $crfval= 30 - $crfoffset;
- ffmpeg -i $_.FullName -c:v libx265 -crf $crfval -vf "crop=trunc(iw/2)*2:trunc(ih/2)*2" -pix_fmt yuv420p -sws_flags spline+accurate_rnd+full_chroma_int -color_range 1 -colorspace 5 -color_primaries 5 -color_trc 6 -f hevc "$($_.Directory)\$($_.Basename).hvc";
- MP4Box -add-image "$($_.Directory)\$($_.Basename).hvc:primary" -ab heic -new "$($_.Directory)\$($_.Basename).heic";
- }
- mdel $tpath hvc
- }
- Else
- {
- dir -recurse -path $tpath -include *.$sformat |%{
- $quality=[int]$quality;
- $magickquality=$quality * 100;
- #$magickquality="$magickquality"+"%";
- magick $_.FullName -quality $magickquality -interlace Plane -sampling-factor 4:2:0 -strip "$($_.Directory)\$($_.Basename).$tformat";
- }
- }
- }
复制代码
-------------------------
2020年5月3日16点47分更新
关于如何安装ffmpeg
这一部分内容正确, 然而Imagemagick会自动安装ffmpeg, 不需要额外手动安装了
1. 打开下载下来的压缩包
2. 解压到一个文件夹里
3.找一个你喜欢的地方把他放进去
4.复制bin文件夹的路径
5.打开path
6.进入path
7.编辑path
8.新建一个路径
9.粘贴你最开始复制的bin文件夹的路径到这里
一路确定结束安装
-----------------
2020年5月3日07点54分 新增原理科普 解释了heic为什么nb
----------------
更新了对比图 2020年5月2日 15点15分
--------------
正文
前两天看到aji47有关漫画阅读器的帖子:
https://bbs.saraba1st.com/2b/thread-1924064-1-1.html
一方面感叹楼主的行动力, 一方面也发现还有很多人也在本地保存着喜欢的漫画.
任何种类的收藏在达到一定规模之后必然会逐步提高对储存介质容量的需求.
在图片储存这方面, 一个高效的格式, 可以在画质无损的情况下以极大的比率减少文件所需要的储存空间.
然而优秀的图片格式有很多种, 但并不是每种都得到了广泛支持.
号称最高压缩比的Flif, 已经不知道多久没更新了.
据称性能最好的BGP, 连解码器都需要自己编译.
如果你的图片规格是哪儿哪儿用着都费劲, 转换格式其实也是自找麻烦.
所幸, 除了png jpg gif 这类古董货之外, 我们是有一个泛用性高, 压缩比高, 渲染性能优秀的图片格式的,
那就是
webp(划掉)
说错了...
那就是
HEIC!
关于heic的起源和爸爸们, 还有它和webp的恩怨, 想了解的还请自行百度, 看完之后说不定你也会高呼 "万恶的资本主义"
heic本身其实不是图片格式, 而是一种容器(里面甚至可以放json), 这里我们所说的是heic格式的图片, 不是heic封装jpg png webp, 而是封装了.265编码的一帧的heic
至于.265, 对视频压制有了解的各位或多或少知道这个编码的性能是如何优秀, 这里我们要做的, 就是利用这个性能, 对原有的图片重新编码封装, 达到无损转换图片, 节省空间的目的.
前期准备
1. FFmpeg(被ImageMagick包含 不需要额外下载)
2.ImageMagick
3.Mp4box
4.Hevc图像扩展
(可选): 第三方图片阅读器
只想看heic, 只需要进行第四步和可选即可
1-3 下载各自的软件包:
https://ffmpeg.zeranoe.com/builds/
https://imagemagick.org/download ... -10-Q16-x64-dll.exe
https://gpac.wp.imt.fr/downloads/gpac-nightly-builds/
4.
(可选): 切换win10地区设置为美国
(必选):
https://www.microsoft.com/en-us/ ... 7593_1243925&tduid=$ir__1lik369jrkkftjh9kk0sohzx0e2xngsgfopfoxd900$$7593$$1243925$$dquE8U2QoAw-vAQJT5WIzcashB34AtLacA$$$&ranMID=24542&ranEAID=dquE8U2QoAw&ranSiteID=dquE8U2QoAw-vAQJT5WIzcashB34AtLacA&epi=dquE8U2QoAw-vAQJT5WIzcashB34AtLacA&irgwc=1&irclickid=_1lik369jrkkftjh9kk0sohzx0e2xngsgfopfoxd900&wa=wsignin1.0&activetab=pivot:overviewtab
上面的链接好像不好使?
https://www.microsoft.com/en-us/ ... cturer/9n4wgh0z6vhq使用微软账号购买安装此免费视频扩展
(必选):
在微软商店搜索heic图像扩展, 安装, 也是免费的. 之所以上面那个提供链接, 是因为只有美区有, 国区搜索不到.
回复中有人提供了国区链接
5.(可选) 第三方阅读器 Xnview MP
在完成了前四步之后, 你的电脑应该已经可以无障碍查看heic图像了(默认照片程序).
如果你想使用第三方阅读器来统一阅读体验(假设你还需要阅读webp), 那么我建议你安装xnview, 及其heic扩展:
https://newsgroup.xnview.com/viewtopic.php?t=36661
这里所说的heic和heif是一回事.
批量转换你的图片
#具体实现没有兴趣直接拉到最后
转换的流程如下:
解码图片 编码图片 封装成heic
在仅仅考虑这些的条件下, 我们只要ffmpeg就可以解决:
- ffmpeg -i "$($_.Directory)\$($_.Basename).$sformat" -crf $crfval -preset veryslow -tune grain -pix_fmt yuv420p10le -f hevc "$($_.Directory)\$($_.Basename).hvc";
- MP4Box -add-image "$($_.Directory)\$($_.Basename).hvc:primary" -ab heic -new "$($_.Directory)\$($_.Basename).heic";
- rm "$($_.Directory)\$($_.Basename).hvc";
复制代码 -i 后面是输入文件地址 -crt是质量参数 越低越好 0 为无损 后面的""内的是输出文件的地址.
输出之后使用mp4box封装, 然后移除帧文件, 里面所有$开头的都是powershell设定的变量, 因为这是直接从我的函数中截取出来的, 所以可读性差一点.
熟悉powershell的朋友可能看出来这些大部分都是 管道传递的对象的属性.
然而hevc编码有一个问题, 那就是编码文件的时候, 只接受 "长宽都是偶数的图片". 然而图片大小这种东西...讲道理虽然是视频常见的分辨率就那么几种, 图片的分辨率则是千差万别.
ffmpeg虽然内置了一个拉伸算法来允许你对图像进行拉伸,
然而这种加减一个像素的拉伸, 在这些本应用于 成倍缩放的情景中 的算法手下会产生极为糟糕的后果.
反映到漫画上来, 就是细节纹理恶化, 网点全灭.
由于上述原因, 这里我采用的是对图像平铺扩展的方式进行大小改变.
- magick $_.FullName -gravity center -extent "($imwidth)x($imheight)" -quality 100% "$($_.Directory)\$($_.Basename).$sformat";
复制代码 通过将图像至于大了半圈的底板中心 (其实不那么中心, 偶数怎么可能有中心呢?)里,
来让图像满足hevc编码的条件.
在成品的函数中, 我是用判断余数的方式自动设置了缩放参数.
!!!!! 注意 这里会直接在原图的基础上进行修改, 图片质量不会变化, 只是多了一圈像素,
但为了规避可能的失误操作, 在处理之前请复制一些文件进行测试
到这里两步, 必要的工作都已经结束了.
用过power shell的 get children 获取对象, 依次传递到管道执行命令就可以完成格式转换.
因为其他图像格式之间的转换不需要ffmepg, imagemagic就可以支持, 所以加了一个判断目标格式的if在里面,
其他情况都是使用IM, heic时使用ffmpeg.
顺便说一句, win10的image magick是支持hevc解码的, 也就是说它可以从heic转出, 而不能转入.
下面就是完整的函数了,.
在"我的文档\WindowsPowerShell"文件夹下新建一个名为:
Microsoft.PowerShell_profile.ps1
的空文件, 使用记事本打开, 粘贴下面的函数保存.
紧急修正! 函数现已使用8bit YUV色彩空间, win10的扩展不支持10bit的hevc!!!
第二次修正, 有人评论色彩空间的问题, 我找了几个彩**片试了一下, 确实需要进一步修正.
这里使用colormatrix对原图的色彩空间到新的色彩空间做了变换, 也启用了回复中的无损参数
扩展阅读:https://trac.ffmpeg.org/wiki/colorspace
ffmpegWIKI中对色彩空间变换的解释和例子.
我找了几个pixiv的图试了一下, 色彩空间映射基本完美了.
不过这个东西 源头不同 需要的参数也不同 不能一概而论
所以要是有谁发现变换之后色彩不一样了 可以发出来大家一起研究一下
- function imgconv($tpath, $quality,$sformat ,$tformat)
- {
- If($tformat -eq "heic")
- {
- dir -recurse -path $tpath -include *.$sformat |%{
- $extentmark = 0;
- $imwidth=magick identify -ping -format "%w" $_.FullName
- $imwidth=[int]$imwidth;
- If(($imwidth)%2 -ne 0)
- {
- $imwidth=$imwidth+1;
- $extentmark=1;
- }
- $imheight=magick identify -ping -format "%h" $_.FullName;
- $imheight=[int]$imheight;
- If(($imheight)%2 -ne 0)
- {
- $imheight=$imheight+1;
- $extentmark=1;
- }
- If($extentmark)
- {
- magick $_.FullName -gravity center -extent "($imwidth)x($imheight)" -quality 100% "$($_.Directory)\$($_.Basename).$sformat";
- }
- }
- dir -recurse -path $tpath -include *.$sformat |%{
- $crfoffset = $quality * 10;
- $crfval= 11 - $crfoffset;
- ffmpeg -i "$($_.Directory)\$($_.Basename).$sformat" -crf $crfval -x265-params lossless=1:range=full -dst_range 1 -pix_fmt yuv420p -sws_flags spline+accurate_rnd+full_chroma_int -color_range 1 -colorspace 5 -color_primaries 5 -color_trc 6 -f hevc "$($_.Directory)\$($_.Basename).hvc";
- MP4Box -add-image "$($_.Directory)\$($_.Basename).hvc:primary" -ab heic -new "$($_.Directory)\$($_.Basename).heic";
- rm "$($_.Directory)\$($_.Basename).hvc";
- }
- }
- Else
- {
- dir -recurse -path $tpath -include *.$sformat |%{
- $quality=[int]$quality;
- $magickquality=$quality * 100;
- #$magickquality="$magickquality"+"%";
- magick $_.FullName -quality $magickquality -interlace Plane -sampling-factor 4:2:0 -strip "$($_.Directory)\$($_.Basename).$tformat";
- }
- }
- }
复制代码
然后使用管理员身份打开powershell, 设置执行策略 (如果一切正常, 你打开powershell的时候应该会报错说什么权限啊 策略啊之类的问题)
- set-executionpolicy remotesigned
复制代码 完成之后重启powershell即可使用上方函数.
用法如下
在powershell中输入
- imgconv "图片所在的目标文件夹" 质量参数 原图格式 目标格式
- #例子一 jpg转heic
- #这里用的函数是最上方的那个 crf基础为30 质量参数设为1时crf为20 crf设置为3时进行无损转换
- imgconv "D:\Download\manga\Akira" 3 jpg heic
- #例子二 jpg和png之间互相转换
- #当目标格式不是heic的时候 转换仅仅使用imagemagick进行
- #这是质量参数会映射为百分比
- #即1=100%质量 0.75=75%质量
- #在目标格式heic的时候 质量参数是对基础crf的改变
- #这里则是直接的百分比映射
- imgconv "D:\Download\Manga\bababababa" 1 jpg png
- #例子三 快速转换
- #"快速" 这一特点仅仅在目标为heic时有效
- #可能会导致你损失一列像素
- fimgconv "D:\Download\manga\Akira" 3 jpg heic
复制代码 即可递归查找目标路径下所有 原图格式 的图片 转换为 目标格式.
题外话
其实webp也是相当不错的选择, 不过我是苹果用户, 而苹果对webp的支持真是一言难尽....
顺便, 有人知道怎么用sharex上传图片到gitee么..
题外话2
这个是链接里的那个扩展, 美区有免费版的 国区只有收费版的...
如果这个找不到的话可以试试第三方的浏览器
题外话3
推荐一个ios上的支持webp heic的漫画阅读器 里世界
功能和别的阅读器比起来属于被秒杀的类型 但是支持heic和webp 但是支持heic和webp 但是支持heic和webp 但是支持heic和webp
题外话4
xnview支持10bit解码 所以如果你使用xnview 可以:
- ffmpeg -i "$($_.Directory)\$($_.Basename).$sformat" -crf $crfval -preset veryslow -tune grain -pix_fmt yuv420p -f hevc "$($_.Directory)\$($_.Basename).hvc";
复制代码 这一行改成:
- ffmpeg -i "$($_.Directory)\$($_.Basename).$sformat" -crf $crfval -preset veryslow -tune grain -pix_fmt yuv420p10le -f hevc "$($_.Directory)\$($_.Basename).hvc";
复制代码 现在支持heic的阅读器 比如 imageglass 大多都是8bit only 所以为了兼容性 还是使用8bit模式就行
但是苹果支持10bit 23333
题外话5
我其实很想发个对比图...但是我的都处理完了.....
题外话6
虽然现在(2020年5月2日14点40分)的函数里面启用了无损模式
- -x265-params lossless=1:range=full
复制代码 但是因为后面一系列色彩操作优化还不是很好 所以压缩比并不是很理想
如果想要在这个基础上达到比较高的压缩比
去掉lossless=1
题外话7
如果上面的你觉得也不行 可以试试这个 这个是我现在用的 使用函数的时候 参数给低一点也无所谓 (目前设置最高1 最低0.1)
我很懒, 你仔细看函数里面参数映射那里就会发现, 无论你怎么调节输入, crt的范围永远都低于无肉眼可见损失的范围
所以你可以随便改改 把$crfval的初始值设置成30啥的 (现在是11), 能压缩的更好.
- ffmpeg -i "$($_.Directory)\$($_.Basename).$sformat" -crf $crfval -x265-params range=full -dst_range 1 -pix_fmt yuv420p -sws_flags spline+accurate_rnd+full_chroma_int -vf "colormatrix=bt470bg:bt709" -color_range 1 -colorspace 1 -color_primaries 1 -color_trc 1 -f hevc "$($_.Directory)\$($_.Basename).hvc";
复制代码
题外话8
最最最最最最终参数
- ffmpeg -i $_.FullName -crf $crfval -pix_fmt yuv420p -sws_flags spline+accurate_rnd+full_chroma_int -color_range 1 -colorspace 5 -color_primaries 5 -color_trc 6 -f hevc "$($_.Directory)\$($_.Basename).hvc";
复制代码
题外话9
这两天在写QT的UI 等我弄差不多了 撸个图形界面出来
大型题外话
heic好在哪里?
在我们正式进入这个话题之前, 我们首先要知道图片这种东西, 大体上有两种储存形式:
位图和矢量图
这两者的区别主要在于图像的储存原理上, 图像中包含很多信息,
在储存这些信息时, 位图将"图像"上的所有点, 向一个 X × Y 的高维矩阵进行映射, 每一个点包含了一组颜色信息 (这就是先前我们的提到的色彩空间),
一个像素点只能有一组色彩, 在极端情况下, 使用 1 × 1的矩阵对图像进行映射, 我们只能得到一个色块, 图像的信息就这么阵亡了.
这就是我们平常说的分辨率越高 图像能储存的信息越多 (质量不一定越好).
而矢量图走的则是另一种风格, 矢量图不是用矩阵, 而是用数学公式, 通过"算式"来储存图像信息.
对于一个普通的圆, 位图用一圈像素来表示, 需要记载每一个点的所有信息, 而矢量图只需要一个公式就可以表示这个圆.
这样一来, 矢量图本身就没有分辨率的限制, 可以无限放大缩小, 非常美好.
然而在储存简单图片的时候矢量图很吊, 可一旦战场扩大到颜色复杂, 图形复杂的"照片"领域, 矢量图的体积就会爆发性的增长, 渲染难度也不断加大,
不管怎么说, 这都不是一个储存复杂图像的合理选择.
"压缩"
如果我们的目的是用尽可能少的空间来储存复杂图像的话, 基于上述原因, 首先就排除了矢量图.
重点就在于如何高效的储存位图信息上, 这里我举几个例子, 说说几个常见格式的做法.
古老的Bitmap(bmp)
1.拿出一张jpg, 打开你的matlab,
2.读取这张jpg,
3.得到了一个和每一个像素点一一对应的 x × y 的矩阵,
4,把矩阵原封不动的储存起来.
好的, 你得到了一张bitmap. 在渲染图片的时候, 无论你采用什么格式来储存图像, 最终都会得到一个广义上的bitmap.
(最终显示在你的显示器上)
就格式而言, bmp不对矩阵进行任何压缩, 无损储存所有信息, 但也因此体积十分巨大.
土豪可以接触到的RAW
这个我没用过, 没具体研究过.
如果说bmp格式原封不动的储存了所有矩阵信息的话,
那相机使用的RAW格式连各种传感器的数据都无损保存了.
这是一组原初的数据, 在数字图像领域, 这种元初就代表了最丰富的信息.
人人都在用的JPG
拿出你刚才储存的bitmap, 把图像分成n个8 × 8的像素块.
对像素块进行二位傅里叶展开, 得到一组频域的信息,
从左到右从上到下 依次排列 从低频到高频的分量的系数
去掉高频信息(把高频部分归零, 所以说jpg是天生有损的)
然后使用Z字编码对图像进行编码(因为高频都在右下角 所有压缩率很高).
这样你就得到了一个JPG.
表情包越传越绿就是因为高频信息在无数次压缩之中渐渐丢失了...
感兴趣的人推荐阅读:https://www.freecodecamp.org/new ... 2316f35/#.y8yys5lh0
PNG
这个格式是无损的
拿出你刚才的bitmap, 图像进行差分编码.
所谓差分编码, 是在说图像的储存过程中, 每一个像素的实际值, 都被转化为了通过周围像素的计算的一个式子.
哪一组 1 × n的像素条举例子:
1 2 3 4 5 6 9
第二个像素的值 可以写成 1+1
第三个像素的值 就是 第二个像素 +1
第七个像素的值 是第六个像素的+3
那么依据这个方式来储存上面的式子的话, 就可以写成:
1 1 1 1 1 1 3
这里面有很多的1, 电脑就没必要储存一堆1 只需要储存 "接下来的n个格子里都是1" 就可以了, 节省大量的空间.
GIF
没了解过
TIFF/TIF
十分灵活复杂的图像格式, 我所有的电子书扫图 (插图比较少的, 偏文字的, 都是使用tif储存的)
这个格式里面可以像heic一样加入各种图像数据,
再用一些tag(tiff全名 tag image format file)来标记各种信息(色彩空间 压缩算法一类的)
它可以无损压缩, 也可以有损压缩,
对于主打文字的轻小说的扫图而言,
使用tiff将图像变为黑白两色之后进行压缩, 可以制造出体积很小的高质量扫图.
Webp
现在谷歌主推的格式:
他是基于VP8视频标准的一种新型格式, 先不说背后的爸爸们体量多大, 仅从技术角度来讲,
WEBP博采众长, 说是第二强的图片格式也不为过.
首先webp(有损, webp的有损无损算法类似但是不一样)的核心技术是源自VP8的宏预测,
所谓宏观预测, 就是对图像进行4 × 4 的分块之后, 基于左边和上边的格子, 对现在的格子进行推导.
webp会采用一系列推导方式, 并和原图的对应色块作比较, 记录下来该区域采用的最终效果最好的"推导方式".(像不像png?)
在这个基础上, webp对色块还进行了jpg所用的取高频压缩处理.
最终实现了一个压缩能力顶尖的图像格式.
webp同时还有无损格式, 参见:https://developers.google.com/sp ... tream_specification
Heic
Heic全称: High....emmm 好像是High Efficiency Image with hevC encoder
就像webp起源于vp8一样, heic也有个好爹, 即苹果的mov格式, 好像叫quick time format.
我之前提到过, heic是容器 容器内部可以套视频或者图片或者别的容器, 我就曾经给webp套过heic来尝试欺骗ios 不过这是后话了.
我们这里只讨论使用hevc编码, 采用heic容器封装的heic, 后面所有heic均指容器本身, hevc指图像编码方式.
Heic的结构其实很简单
抛开储存信息的部分不谈, 重点是储存带时间的轴的视频moov部分和储存图像(或者序列, 类似gif那种一组图像)的mdat部分.
苹果在heic格式 并不是单纯的将一张图片放入容器中的mdat部分,
而是对图像进行了再分割, 把所有小块储存在一个个mdat中, 和png等格式不同的是, heic这种组织结构并不是线性派生的.
从png获取图像你需要从原点出发依次推演, jpg你需要线性解码, webp你也需要推演,
但HEIC是支持多线程编码解码的, 如果你有GPU, 解码编码的速度还能进一步提升.
这就是说, 仅就读写性能而言, heic是当之无愧的最强图像格式.
但我只所以在这里介绍heic, 是为了节省大家的空间, 而不是获得最强的吞吐性能.
这种heic之所以可以在无损的情况下极大压缩空间, 还要得益于H265编码自身的优越性.
我之前说webp的压缩的时候提到了一种基于VP8的预测算法, hevc使用的预测方式和webp的方式类似.
硬要说有什么不同的话, 那就是webp倾向于用"一组 x × y"去预测另外一组 "x × y",
而h265 h264都倾向于用 预测区域左上角两排像素来预测.
这种改变不会给图像体积带来多么大的压缩(其实已经很大了, 这里是和后面的对比),
在高频信息特别丰富的情境下, 想要尽可能保留原图质量, 这些预测的使用必然会受到限制.
就好像h264和webp一共就那么几个预测模式,
如果都不合适, 那就只能原封储存图像块, 仅仅进行类似png的压缩算法, 提高了储存所需要的空间.
下图是h264支持的预测模式
webo支持的预测模式如何
BANNER
H
2
6
5
支持的预测模式:
一共
34种!!!!
这就是为什么hevc编码能达到如此之高的压缩率, 通过使用高达34种预测模式, 预测区域 和 原图 无损撞车的概率提高.
最终秒天秒地秒谷歌, 成为了最强的图像格式.
咕.. 解释完了(我在激动什么?
凭印象写的 可能有错误或者有过时的内容 还请大佬多多包涵 或者在回复区指出错误
从onedrive里找到了以前的标准文件 发上来感兴趣的可以看看....
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
评分
-
查看全部评分
|