找回密码
 立即注册
搜索
查看: 15107|回复: 109

[漫画] 用HEVC压缩你的漫画(EP1) -ffmpeg and mp4box-

[复制链接]
     
发表于 2020-5-2 11:13 | 显示全部楼层 |阅读模式
本帖最后由 冰箱研会长 于 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用户采用如下参数:
  1. #for yuv444 and yuv44410le use following code
  2. #8-bit yuv444
  3. 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";
  4. #10-bit yuv444
  5. 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%的时候 体积不减反增 找不到明显的色块变化
crf20webp 45%的时候 二者体积均下降到原来的1/4上下 可以看到低频区相比原图有明显的高频损失
crf30的时候 体积已经是原来的1/10, 高频信息少量丢失


之所以会有这样的差别 说白还是webp编码支持的预测模式比较少, 就算放宽一点质量参数, vp8预测不了只能直接压缩的部分很可能仍然不满足条件, 只能直接压缩.
而hevc的预测模式那么多, 条件稍微放宽一点, 就有大量的色块可以被准确预测, 自然在压缩率上表现比较好.

----------------

可能是最后一次更新 20点58分
整合了所有题外话里面的优化的最终版本imgconv函数 + 仅仅使用ffmpeg实现编码的fimgconv(高速的代价是你也许会损失边缘的一列/行像素)
顺便优化了帧文件的删除


  1. #批量删除
  2. function mdel($tpath, $tformat){
  3.         dir -recurse -path $tpath -include *.$tformat |%{
  4.                 $_.Delete();
  5.         }
  6. }

  7. #普通版
  8. function imgconv($tpath, $quality,$sformat ,$tformat)
  9. {
  10.         If($tformat -eq "heic")
  11.         {
  12.                 dir -recurse -path $tpath -include *.$sformat |%{
  13.                         $extentmark = 0;
  14.                         $imwidth=magick identify -ping -format "%w" $_.FullName
  15.                         $imwidth=[int]$imwidth;
  16.                         If(($imwidth)%2 -ne 0)
  17.                         {
  18.                                 $imwidth=$imwidth+1;
  19.                                 $extentmark=1;
  20.                                 }
  21.                         $imheight=magick identify -ping -format "%h" $_.FullName;
  22.                         $imheight=[int]$imheight;
  23.                         If(($imheight)%2 -ne 0)
  24.                         {
  25.                                 $imheight=$imheight+1;
  26.                                 $extentmark=1;
  27.                         }
  28.                         If($extentmark)
  29.                         {
  30.                                 magick $_.FullName -gravity center -strip -extent "($imwidth)x($imheight)" -quality 100% $_.FullName;
  31.                         }
  32.                 }

  33.                 dir -recurse -path $tpath -include *.$sformat |%{
  34.                         $crfoffset = $quality * 10;
  35.                         $crfval= 30 - $crfoffset;
  36.                         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";
  37.                         MP4Box -add-image "$($_.Directory)\$($_.Basename).hvc:primary" -ab heic -new "$($_.Directory)\$($_.Basename).heic";
  38.                 }
  39.                 mdel $tpath hvc
  40. }
  41.         Else
  42. {
  43.         dir -recurse -path $tpath -include *.$sformat |%{
  44.                 $quality=[int]$quality;
  45.                 $magickquality=$quality * 100;
  46.                 #$magickquality="$magickquality"+"%";
  47.                 magick $_.FullName -quality $magickquality -interlace Plane -sampling-factor 4:2:0 -strip "$($_.Directory)\$($_.Basename).$tformat";
  48.                 }
  49. }
  50. }


  51. #图像分辨率有奇数的时候会损失一列/行像素的高速版
  52. function fimgconv($tpath, $quality,$sformat ,$tformat)
  53. {
  54.         echo "This may delete one column/row of pixels!!!!!!!"
  55.         If($tformat -eq "heic")
  56.         {
  57.                 dir -recurse -path $tpath -include *.$sformat |%{
  58.                         $crfoffset = $quality * 10;
  59.                         $crfval= 30 - $crfoffset;
  60.                         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";
  61.                         MP4Box -add-image "$($_.Directory)\$($_.Basename).hvc:primary" -ab heic -new "$($_.Directory)\$($_.Basename).heic";
  62.                 }
  63.                 mdel $tpath hvc
  64. }
  65.         Else
  66. {
  67.         dir -recurse -path $tpath -include *.$sformat |%{
  68.                 $quality=[int]$quality;
  69.                 $magickquality=$quality * 100;
  70.                 #$magickquality="$magickquality"+"%";
  71.                 magick $_.FullName -quality $magickquality -interlace Plane -sampling-factor 4:2:0 -strip "$($_.Directory)\$($_.Basename).$tformat";
  72.                 }
  73. }
  74. }

复制代码



-------------------------

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就可以解决:

  1.                         ffmpeg -i "$($_.Directory)\$($_.Basename).$sformat" -crf $crfval  -preset veryslow -tune grain  -pix_fmt yuv420p10le -f hevc "$($_.Directory)\$($_.Basename).hvc";
  2. MP4Box -add-image "$($_.Directory)\$($_.Basename).hvc:primary" -ab heic -new "$($_.Directory)\$($_.Basename).heic";
  3. rm "$($_.Directory)\$($_.Basename).hvc";
复制代码
-i 后面是输入文件地址 -crt是质量参数 越低越好 0 为无损 后面的""内的是输出文件的地址.

输出之后使用mp4box封装, 然后移除帧文件, 里面所有$开头的都是powershell设定的变量, 因为这是直接从我的函数中截取出来的, 所以可读性差一点.
熟悉powershell的朋友可能看出来这些大部分都是 管道传递的对象的属性.


然而hevc编码有一个问题, 那就是编码文件的时候, 只接受 "长宽都是偶数的图片". 然而图片大小这种东西...讲道理虽然是视频常见的分辨率就那么几种, 图片的分辨率则是千差万别.
ffmpeg虽然内置了一个拉伸算法来允许你对图像进行拉伸,

然而这种加减一个像素的拉伸, 在这些本应用于  成倍缩放的情景中   的算法手下会产生极为糟糕的后果.
反映到漫画上来, 就是细节纹理恶化, 网点全灭.

由于上述原因, 这里我采用的是对图像平铺扩展的方式进行大小改变.
  1.         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的图试了一下, 色彩空间映射基本完美了.
不过这个东西 源头不同 需要的参数也不同 不能一概而论
所以要是有谁发现变换之后色彩不一样了 可以发出来大家一起研究一下

  1. function imgconv($tpath, $quality,$sformat ,$tformat)
  2. {
  3.     If($tformat -eq "heic")
  4.     {
  5.         dir -recurse -path $tpath -include *.$sformat |%{
  6.             $extentmark = 0;
  7.             $imwidth=magick identify -ping -format "%w" $_.FullName
  8.             $imwidth=[int]$imwidth;
  9.             If(($imwidth)%2 -ne 0)
  10.             {
  11.                 $imwidth=$imwidth+1;
  12.                 $extentmark=1;
  13.                 }
  14.             $imheight=magick identify -ping -format "%h" $_.FullName;
  15.             $imheight=[int]$imheight;
  16.             If(($imheight)%2 -ne 0)
  17.             {
  18.                 $imheight=$imheight+1;
  19.                 $extentmark=1;
  20.             }
  21.             If($extentmark)
  22.             {
  23.                 magick $_.FullName -gravity center -extent "($imwidth)x($imheight)" -quality 100% "$($_.Directory)\$($_.Basename).$sformat";
  24.             }
  25.         }

  26.         dir -recurse -path $tpath -include *.$sformat |%{
  27.             $crfoffset = $quality * 10;
  28.             $crfval= 11 - $crfoffset;
  29.             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";
  30.             MP4Box -add-image "$($_.Directory)\$($_.Basename).hvc:primary" -ab heic -new "$($_.Directory)\$($_.Basename).heic";
  31.             rm "$($_.Directory)\$($_.Basename).hvc";
  32.         }
  33. }
  34.     Else
  35. {
  36.     dir -recurse -path $tpath -include *.$sformat |%{
  37.         $quality=[int]$quality;
  38.         $magickquality=$quality * 100;
  39.         #$magickquality="$magickquality"+"%";
  40.         magick $_.FullName -quality $magickquality -interlace Plane -sampling-factor 4:2:0 -strip "$($_.Directory)\$($_.Basename).$tformat";
  41.         }
  42. }
  43. }

复制代码

然后使用管理员身份打开powershell, 设置执行策略 (如果一切正常, 你打开powershell的时候应该会报错说什么权限啊 策略啊之类的问题)

  1. set-executionpolicy remotesigned
复制代码
完成之后重启powershell即可使用上方函数.

用法如下

在powershell中输入
  1. imgconv "图片所在的目标文件夹"  质量参数 原图格式 目标格式
  2. #例子一 jpg转heic
  3. #这里用的函数是最上方的那个 crf基础为30 质量参数设为1时crf为20 crf设置为3时进行无损转换
  4. imgconv "D:\Download\manga\Akira" 3 jpg heic
  5. #例子二 jpg和png之间互相转换
  6. #当目标格式不是heic的时候 转换仅仅使用imagemagick进行
  7. #这是质量参数会映射为百分比
  8. #即1=100%质量 0.75=75%质量
  9. #在目标格式heic的时候 质量参数是对基础crf的改变
  10. #这里则是直接的百分比映射
  11. imgconv "D:\Download\Manga\bababababa" 1 jpg png
  12. #例子三 快速转换
  13. #"快速" 这一特点仅仅在目标为heic时有效
  14. #可能会导致你损失一列像素
  15. 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 可以:
  1.                         ffmpeg -i "$($_.Directory)\$($_.Basename).$sformat" -crf $crfval  -preset veryslow -tune grain  -pix_fmt yuv420p -f hevc "$($_.Directory)\$($_.Basename).hvc";
复制代码
这一行改成:
  1.      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分)的函数里面启用了无损模式
  1. -x265-params lossless=1:range=full
复制代码
但是因为后面一系列色彩操作优化还不是很好 所以压缩比并不是很理想
如果想要在这个基础上达到比较高的压缩比
去掉lossless=1

题外话7
如果上面的你觉得也不行 可以试试这个 这个是我现在用的 使用函数的时候 参数给低一点也无所谓 (目前设置最高1 最低0.1)
我很懒, 你仔细看函数里面参数映射那里就会发现, 无论你怎么调节输入, crt的范围永远都低于无肉眼可见损失的范围

所以你可以随便改改 把$crfval的初始值设置成30啥的 (现在是11), 能压缩的更好.

  1.             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
最最最最最最终参数

  1.                         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里找到了以前的标准文件 发上来感兴趣的可以看看....

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

评分

参与人数 21战斗力 +27 收起 理由
whzfjk + 2 好评加鹅
fat + 2 欢乐多
风速前进mo + 1 好评加鹅
Stellar_Frost + 1 共产主义精神
hein + 2 好评加鹅
Probe_tanji + 1 好评加鹅
史莱姆KING + 2 好评加鹅
水上由崎 + 1 好评加鹅
GrassSand + 1 好评加鹅
yvev + 1 好评加鹅
yst234 + 1 好评加鹅
ArtoriaPendrago + 2 谢谢茄子
Sacko9 + 1 好评加鹅
肆暮江飛鳥 + 1 好评加鹅
酒神的狂欢祭 + 1 好评加鹅
Evomenon + 1 好评加鹅
尼特子很辛苦哟 + 1
haluka + 1
真田丸 + 1
xzhlj0325 + 2

查看全部评分

回复

使用道具 举报

     
发表于 2020-5-2 11:21 | 显示全部楼层
还有这种操作。。感谢楼主。我珍藏的几千本本子有救了硬盘不用被塞得满满的都要溢出来了

  -- 来自 能手机投票的 Stage1官方 Android客户端
回复

使用道具 举报

头像被屏蔽
     
发表于 2020-5-2 11:33 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

头像被屏蔽
     
 楼主| 发表于 2020-5-2 11:42 | 显示全部楼层
提示: 该帖被管理员或版主屏蔽
回复

使用道具 举报

     
 楼主| 发表于 2020-5-2 11:45 | 显示全部楼层
lbs123456 发表于 2020-5-2 11:33
这……色彩空间变了吧 确定是无损吗?

而且函数使用ffmpeg是用的是10位的色彩空间 一般srgb啥的我记得是8位的吧, 讲道理是可以无损的.

评分

参与人数 1战斗力 +1 收起 理由
lbs123456 + 1 我回家刚准备试一下就看到主楼修正了 好评.

查看全部评分

回复

使用道具 举报

头像被屏蔽
发表于 2020-5-2 11:54 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2020-5-2 12:40 | 显示全部楼层
-x265-params lossless=1

评分

参与人数 1战斗力 +1 收起 理由
冰箱研会长 + 1

查看全部评分

回复

使用道具 举报

     
发表于 2020-5-2 14:07 | 显示全部楼层
本帖最后由 菜姬 于 2020-5-2 14:22 编辑

刚想回复lossless 发现楼上已经回答过了
回复

使用道具 举报

     
 楼主| 发表于 2020-5-2 15:13 | 显示全部楼层
到现在我觉得算是完善的差不多了 不算之前改的 发出来之后我又改了七八回.
补充个对比图吧.
Webp的原图 使用题外话7的配置 参数为 0(相对最差 crt是11)


Heic文件夹大小


Webp文件夹大小

再来几张放大的细节对比图:



转换出来的heic封面



webp原图的封面

二者文件大小 heic:webp
500kb 2.05mb


一张科尔维特的车灯 heic格式


还是那个车灯 webp格式

二者体积对比
476kb 1385kb



488的车标 heic



webp

大小对比:

433.19kb 1.67mb


回复

使用道具 举报

     
发表于 2020-5-2 15:34 | 显示全部楼层
HEVC扩展可以来这里获取直链
比如上面那个:x64   x86
回复

使用道具 举报

     
 楼主| 发表于 2020-5-2 15:41 | 显示全部楼层
若荼泱 发表于 2020-5-2 15:34
HEVC扩展可以来这里获取直链
比如上面那个:x64   x86

这什么宝贝网站 藏了
回复

使用道具 举报

发表于 2020-5-2 15:52 | 显示全部楼层
本帖最后由 华蝶风雪 于 2020-5-2 15:54 编辑

这种增减一像素在ffmpeg可以直接做
https://ffmpeg.org/ffmpeg-all.html 39.148 pad

评分

参与人数 1战斗力 +1 收起 理由
冰箱研会长 + 1 我是惯用imagemagick ff实在是不熟悉.

查看全部评分

回复

使用道具 举报

     
发表于 2020-5-2 15:57 | 显示全部楼层
码一个
回复

使用道具 举报

     
发表于 2020-5-2 16:03 | 显示全部楼层
ComicShare能用webp,从某漫画抓出来是webp,实在是懒得折腾了……

真无损的话,傻瓜化工具希望

评分

参与人数 1战斗力 +1 收起 理由
冰箱研会长 + 1 可以等我写个qt UI出来 你可以看我楼上的对.

查看全部评分

回复

使用道具 举报

     
 楼主| 发表于 2020-5-2 16:54 | 显示全部楼层
Aeroblast 发表于 2020-5-2 16:03
ComicShare能用webp,从某漫画抓出来是webp,实在是懒得折腾了……

真无损的话,傻瓜化工具希望 ...

可以看眼楼上的对比图 2000%放大 像素块看不出差别 没拿滴管工具试 我待会直接传一个对比包 大家可以自己拿回去测试
回复

使用道具 举报

     
 楼主| 发表于 2020-5-2 16:56 | 显示全部楼层
https://send.firefox.com/downloa ... d6HWT6US3INBIzNioTQ

HEIC对比包 20次下载/7天之后报废
回复

使用道具 举报

     
发表于 2020-5-2 17:46 | 显示全部楼层
本帖最后由 肆暮江飛鳥 于 2020-5-2 17:48 编辑

楼主的方法对于我这种小白来说太麻烦了,希望楼主能做出一个软件来分享,感谢。
但小白有小白的方法,我用这个软件批量压缩,分辨率不变情况下有损压缩,压缩率挺高的,黑白漫画有损压缩清晰度对比不是特别明显。





运行打不开的记得安装Microsoft Visual C++ 全家桶

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

评分

参与人数 1战斗力 +1 收起 理由
冰箱研会长 + 1 抽空做

查看全部评分

回复

使用道具 举报

     
 楼主| 发表于 2020-5-2 18:16 | 显示全部楼层
华蝶风雪 发表于 2020-5-2 15:52
这种增减一像素在ffmpeg可以直接做
https://ffmpeg.org/ffmpeg-all.html 39.148 pad

我仔细时间了一遍, 不需要imagemagick了 速度也提升了 但是问题在于imagemagick的增减像素是根据周围像素的 而ffmpeg只是固定颜色增加像素 而这里用的libx265有不支持透明像素的alpha通道. 唯一的选择就是不pad 而是crop 但是crop可是实实在在删掉了一层像素啊.

在libx265支持alpha之前, 还得用imagemagick做这个pad处理.
回复

使用道具 举报

     
发表于 2020-5-2 20:42 来自手机 | 显示全部楼层
好贴马克

—— 来自 Xiaomi MIX 2S, Android 9上的 S1Next-鹅版 v2.2.2.1
回复

使用道具 举报

     
发表于 2020-5-2 20:42 | 显示全部楼层
好帖顶,虽然估计用不到
回复

使用道具 举报

     
发表于 2020-5-2 20:46 | 显示全部楼层
前段时间下了两部港漫 PDF格式的 十好几G  
回复

使用道具 举报

     
发表于 2020-5-2 23:50 | 显示全部楼层
哦对了 大佬有没有直接重压缩zip文件的办法(某些图片大的离谱了)  一个个倒腾挪到另一个盘解压在用压缩图软件过一遍 在重新打包搞几个就受不了了。
回复

使用道具 举报

头像被屏蔽
     
发表于 2020-5-3 00:34 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2020-5-3 01:23 | 显示全部楼层
aji47 发表于 2020-5-3 00:34
重新压缩的话 windows的好压有单独压缩
或者我这边有个简陋脚本

怎么用!!!下下来个文件ShiguReader-dev不会用
哦我是火狐好像装不了 而且我说的功能可能复杂了些稍有些不同 不过还是谢谢了
回复

使用道具 举报

     
发表于 2020-5-3 02:13 来自手机 | 显示全部楼层
之前还费了挺大功夫把收藏的漫画都转成webp格式的,不过确实webp还不够理想。
2k分辨率左右30页的本子,q75的webp也要80m左右,如果heic在安卓上支持的好的话就打算再全转成heic了。

—— 来自 OnePlus ONEPLUS A3000, Android 10上的 S1Next-鹅版 v2.2.2.1
回复

使用道具 举报

头像被屏蔽
     
发表于 2020-5-3 02:28 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
 楼主| 发表于 2020-5-3 06:25 | 显示全部楼层
本帖最后由 冰箱研会长 于 2020-5-3 06:29 编辑
loli炮 发表于 2020-5-2 20:46
前段时间下了两部港漫 PDF格式的 十好几G

可以用 PDF补丁丁 拆开 然后处理一遍 但是PDF不支持插入heic 处理之后就只能用压缩包一类的管理 不过就凭heic这个压缩比 我现在已经不用压缩包了..
回复

使用道具 举报

     
 楼主| 发表于 2020-5-3 06:26 | 显示全部楼层
SmterC 发表于 2020-5-3 02:13
之前还费了挺大功夫把收藏的漫画都转成webp格式的,不过确实webp还不够理想。
2k分辨率左右30页的本子,q75 ...

你可以试试 小米肯定是支持的 我记得发布会里面有讲过
回复

使用道具 举报

     
发表于 2020-5-3 07:39 | 显示全部楼层
想法不错。不过你这是有多少图才需要这样折腾?我觉得不如直接买硬盘
回复

使用道具 举报

     
发表于 2020-5-3 08:08 来自手机 | 显示全部楼层
视频编码在压缩连续的多张差别极小的图片时很有效,但漫画里这种情况一般不多见吧,真出现这种情况一般都会被读者喷是在水页数
回复

使用道具 举报

     
 楼主| 发表于 2020-5-3 09:55 | 显示全部楼层
plusSharp 发表于 2020-5-3 08:08
视频编码在压缩连续的多张差别极小的图片时很有效,但漫画里这种情况一般不多见吧,真出现这种情况一般都会 ...

你看眼我刚更新的 这里用的不是视频编码的帧对比技术 是同帧内的分块压缩
回复

使用道具 举报

     
 楼主| 发表于 2020-5-3 09:55 | 显示全部楼层
aji47 发表于 2020-5-3 02:28
那是一个单独node脚本 和其他的代码完全无关 node 文件名就行了

诶,你还是安装好压好了 ...

咕 我写完介绍部分了....
回复

使用道具 举报

     
发表于 2020-5-3 15:48 | 显示全部楼层
本帖最后由 alien 于 2020-5-3 15:51 编辑

作为技术小白和懒人,偶尔也扫扫图的人,想要的是
1、一键安装包含所有必须插件的图形界面的图片转换程序。主楼的软件链接能安的都安了 ffmpeg那个不知怎么安装~ 然后官方下载下来的好像是appx安装文件那个要win10吧~办公室电脑win7~
2、最好是有photoshop也能用的转换存储插件,修图存储一步到位。
3、推荐能阅读zip rar压缩包中的heic格式的看漫画软件,上面XnView我看不了压缩包里的图片~随手搜了下好像没办法看?~~~~毕竟习惯一个包一本漫画的形式,只能散放在文件夹里面看不方便
qq浏览器能看lz的heic但解析不正确~有条纹~ 安装不了appx
如果有插件安装后什么看图软件都能看的最好~不用更换软件~(这个是奢望吧~)
回复

使用道具 举报

     
发表于 2020-5-3 15:55 | 显示全部楼层
好评加鹅
不断jpg压缩到最后应该会变成高斯模糊……越来越绿是因为每次上传百度贴吧会加上一层绿色的滤镜……
回复

使用道具 举报

     
 楼主| 发表于 2020-5-3 16:45 | 显示全部楼层
alien 发表于 2020-5-3 15:48
作为技术小白和懒人,偶尔也扫扫图的人,想要的是
1、一键安装包含所有必须插件的图形界面的图片转换程序。 ...

ios上面我知道一个里世界阅读器可以透zip阅读heic 我用的就是这个
ffmpeg不应该啊...
你确定你下载的是这个?

我这都是exe啊
回复

使用道具 举报

     
发表于 2020-5-3 18:14 来自手机 | 显示全部楼层
拯救硬盘!科普好评 马克

—— 来自 OnePlus ONEPLUS A6000, Android 10上的 S1Next-鹅版 v2.2.2.1
回复

使用道具 举报

发表于 2020-5-3 18:41 | 显示全部楼层
本帖最后由 lwa190212 于 2020-5-3 18:43 编辑

我觉得如果有自动去除印刷时加入的那种模拟灰色的点阵图案的话可以极大减少高频信息量
可惜我一直没有找到合适的算法支持
webp没有单灰度模式,我试过有的情况还不如灰度jpg压缩率高,喷了
回复

使用道具 举报

     
 楼主| 发表于 2020-5-3 19:38 | 显示全部楼层
lwa190212 发表于 2020-5-3 18:41
我觉得如果有自动去除印刷时加入的那种模拟灰色的点阵图案的话可以极大减少高频信息量
可惜我一直没有找到 ...

jpg清洗高频很快的啊 不过为啥要去掉网点呢?
回复

使用道具 举报

     
发表于 2020-5-3 20:10 | 显示全部楼层
啊这个贴让我想起来 刚看论坛怎么DVDISO压到AVI的那时候的教程了
回复

使用道具 举报

发表于 2020-5-3 20:16 | 显示全部楼层
冰箱研会长 发表于 2020-5-3 19:38
jpg清洗高频很快的啊 不过为啥要去掉网点呢?

网点通常用来模拟特定的灰度,换成灰度也不会造成观感上的差异
然后网点会在扫描的时候因为采样率问题出现更不规则的信息
总之网点代表的是一种从我的观感来说去掉也不影响画面的一类高频(带一些中频)信息,而且能去掉的话在某些扫描质量不是很好的漫画中达到非常高的压缩率而不损失其他画质,用jpg压高频会把有价值的信息也破坏掉
我尝试过能用webp的q85压到jpg的30%容量的图,用ps去掉网点后再用q85能达到10%以内,相当于再压缩到之前的webp的1/3以内
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2024-6-16 07:30 , Processed in 0.152721 second(s), 14 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表