1)快速介绍
- 编辑Makefile以更改编译选项(默认编译选项对于Linux应该是OK的)。输入
make
来编译,输入make install
来安装编译后的二进制文件。 - bpgview:为了编译它,你需要安装SDL和SDL_image库。
- Emscripten的使用:为了生成Javascript解码器,你必须安装Emscripten并在Makefile中启用它。
- HTML演示(带有预编译的Javascript解码器)可以在HTML /index.html中找到(如果你使用Chrome并想使用file://访问它,启动Chrome时可以使用选项——allow-file-access-from-files)。
- bgp文件格式在doc/bpg_spec.txt中指定。
2)编译和安装注意事项
2.1)Linux
-
编辑Makefile以更改编译选项(默认编译选项应该是可以的)。输入
make
来编译,输入make install
来安装编译后的二进制文件。 -
使用
make -j N
,其中N是CPU内核的数量,以更快地编译。 -
需要安装如下软件包:SDL-devel
SDL_image-devel yasm。建议使用yasm version >= 1.3.0来加快编译速度。 -
仅支持64位target,因为x265需要它的位深度> 8。
2.2) Windows
-
仅支持Linux下的交叉编译。
-
需要安装如下软件包:mingw64-gcc mingw64-libpng mingw64-libjpeg-turbo mingw64-SDL mingw64-SDL_image yasm。建议使用yasm version >= 1.3.0来加快编译速度。
-
仅支持64位target,因为x265需要它的位深度> 8。
3) bgp编码器
bgp命令行编码器是bpgenc
。它以JPEG或PNG图像作为输入。
-
速度:默认情况下bpgenc使用x265。你可以编译慢得多但更有效的JCTVC编码器,并使用
-e JCTVC
选项选择它。对于x265,您可以使用-m
选项选择编码速度(1 =快,但图像更大,9 =慢,但图像更小)。 -
位深度:默认为8位。你可以将其增加到10 (
- b10
选项)来略微增加压缩率。对于web发布来说,这通常不是一个好主意,因为Javascript解码器使用更多的内存。编译后的x265编码器支持8、10和12位深度。通过启用Makefile定义:USE_JCTVC_HIGH_BIT_DEPTH,可以将较慢的JCTVC编码器编译为支持更高的位深度(最多14)。 -
通过HEVC无损功能,支持无损压缩。在这种情况下使用PNG输入,如果是JPEG输入,压缩与JPEG YCbCr数据相关的是无损的,而不是RGB数据。在任何情况下,位深度应该与你的图片相匹配,否则文件大小会增加很多。缺省情况下,无损模式将位深度设置为8位。首选的颜色空间设置为“rgb”。
注: -
无损模式经过的测试比有损模式少,但它通常在图片上的效果比PNG更好。
-
JCTVC编码器比无损压缩的x265编码器提供更小的图像。
-
x265和JCTVC编码器对量化器参数(-q选项)的解释略有不同。
-
颜色空间和色度格式:
*对于JPEG输入,输入图像的颜色空间不会被修改(它是YCbCr, RGB, YCbCrK或CMYK)。根据首选的色度格式(-f
选项)对色度进行二次采样。
*对于PNG输入,输入图像被转换为首选的颜色空间(-c
选项)。然后根据首选的色度格式对其色度进行次采样。
*灰度图像保持不变。
-
预乘alpha:默认情况下,bpgenc使用非预乘alpha来保留颜色组件。然而,预乘alpha (
-premul
选项)通常以损失颜色分量为代价来获得更好的压缩效果。
如果图像没有编辑,这种丢失不是问题。 -
动画:使用
-a
选项,动画可以从PNG或JPEG图像序列中编码,索引从1或0。
例如:./bpgenc -a anim%2d.png -fps 25 -loop 0 -o anim.bpg
从anim01.png、anim02.png等生成动画。
帧速率用-fps
指定,循环次数用-loop
指定(0 =无限)。
如果每个图像需要不同的延迟,如某些
动画gif文件,文本文件可以用-delayfile
选项指定。
每个图像包含一个数字,表示其持续时间
厘秒。
所有持续时间都被舍入为1/fps
的倍数,因此
设置一致的帧速率很重要。
必要的帧和延迟文件可以使用ImageMagick工具从gif动画中生成:
convert -coalesce anim.gif anim%d.png
identify -format “%T\n” anim.gif > anim.txt
为了减小文件大小,可以选择帧速率,使大多数帧的帧周期为1(因此,如果anims .txt只包含5厘秒的帧持续时间,那么选择20帧/s的帧速率)。
因为gif使用调色板颜色和1位透明度,所以最好从原始素材(例如PNG文件)开始,以获得最好的质量。
不支持动画的bgp解码器只显示第一帧。
-
缺省情况下,bpgenc不复制元数据。你可以使用
-keepmetadata
选项复制它们。对于JPEG输入,复制EXIF、ICCP和XMP。对于PNG输入,复制ICCP。 -
客观比较:x265为SSIM默认调整。JCTVC编码器只针对PSNR进行调整,而不是SSIM,因此在与其他格式进行客观比较时,您应该使用PSNR。
4) bgp解码器
bgp命令行解码器是bpgdec。它输出PNG或PPM图像。使用PPM输出以获得最快的速度。
-
使用
-i
选项,您可以获得关于bgp图像的信息(并且不输出解码图像)。 -
-b
选项选择PNG输出的比特深度(8或16)。它与内部的bgp钻头深度无关。
5) BPG viewer
BPG图像查看器使用SDL库来显示BPG图像和SDL_image库支持的其他图像格式。通过不带参数地启动bpgview来显示可用的键。bpgview支持bgp动画。
6) bgp解码库
BPG图像可以在任何带有libbpg库的程序中解码。
该API还不稳定,因此只提供了一个静态库。
目前没有类似的编码库,因此您应该调用bpgenc实用程序。
7) Javascript解码器
以下是可用的Javascript解码器,按大小排序。
> 8 bits animations
bpgdec8.js no no
bpgdec.js yes no
bpgdec8a.js no yes
8位纯解码器稍微快一些,消耗的内存更少(默认情况下是16 MB,而不是32 MB,如果你想处理更大的图像,可以在Makefile中更改内存配置)。
Javascript解码器将所有标签替换为具有。bgp扩展名为标签的源,并将bgp图像解码为该标签。支持样式表(保留id
和class
属性)。width
和height
属性仅支持像素单位。
图像数据是通过XMLHttpRequest对象下载的。
因此,除非使用跨域资源共享,否则bgp图像和bgp Javascript解码器必须在同一个域中。
在显示动画时,所有的帧都存储在内存中,因此应该避免像gif那样包含大量帧和大分辨率的动画。
asm.js提供了一个有趣的速度提升,所以我们希望更多的浏览器支持这个Javascript子集。
8) FFmpeg修改
-
完全支持chroma_format_idc = 0(单色模式)。
-
修复了RDPCM支持(帧内预测)。
-
减少SAO循环过滤器的内存使用。
-
动态生成IDCT系数,减少代码量。
-
增加了一个“动态位深度”模式,支持从8到14的所有位深度,没有代码重复,但解码速度较慢。
-
增加了一个修改过的SPS头,以减少bgp解码器的大小(另一种解决方案是根据bgp头生成标准的VPS和SPS头)。
-
增加了只保留HEVC帧内代码并抑制所有无关NAL单元的解析的定义。
-
从除HEVC和必要的支持代码之外的所有编解码器中剥离FFmpeg。
9) x265修改
-
支持单色格式(可能缺少bgp不使用的部分)。
-
支持静态构建。
10)许可
-
libbpg和bpgdec是在LGPL许可下发布的(FFmpeg部分是在LGPL许可下发布的,bgp特定部分是在BSD许可下发布的)。
-
bpgenc基于GPL version 2许可证发布。BPG专用代码是在BSD许可证下发布的。JCTVC代码是根据BSD许可证发布的。x265代码是根据GPL发布的
版本2许可证。 -
BPG依赖HEVC压缩技术,该技术在某些国家可能受到专利保护。大多数设备已经包含或将包含硬件HEVC支持,所以我们建议如果专利使用它是一个问题。