Windows下实现BPG压缩以及解压缩(包含python批量处理图片)

系统 3086 0

介绍

BPG(Better Portable Graphics)是一种新的图像格式。 其目的是在质量或文件大小成问题时替换JPEG图像格式。 它的主要优点是:

  1. 压缩比高。 对于类似的质量,文件比JPEG小得多。
  2. 大多数Web浏览器都支持小型Javascript解码器(gzip压缩大小:56 KB)。
  3. 基于HEVC开放视频压缩标准的子集。
  4. 支持与JPEG(灰度,YCbCr 4:2:0,4:2:2,4:4:4)相同的色度格式,以减少转换过程中的损耗。 支持Alpha通道。 还支持RGB,YCgCo和CMYK颜色空间。
  5. 本机支持每通道8至14位,以获得更高的动态范围。
  6. 支持无损压缩。
  7. 可以包括各种元数据(例如EXIF,ICC配置文件,XMP)。
  8. 动画支持。

下载

以下存档包含bpgenc,bpgdec和bpgview命令行实用程序(对于Linux)和关联的libbpg库(读取存档中的README文件)的源代码。 它还包括Javascript解码器的源代码: libbpg-0.9.8.tar.gz
Windows的二进制分发(仅限64位): bpg-0.9.8-win64.zip

以下链接可以下载上述两个工具:

非官方的Github镜像。https://github.com/mirrorer/libbpg
对于Mac用户,可以在libbpg Homebrew 公式中使用BPG实用程序。

参数介绍(可直接使用工具**bpg-0.9.8-win64.zip** )

1. 编码

            
              bpgenc -m 9 -b 8 -q 48 input.png -o output.bpg   # -m 控制速度 -b 控制位深度 -q 控制图像质量 -o 输出图像

            
          

BPG命令行编码器是 'bpgenc' 。它需要JPEG或PNG图像作为输入。有以下几个参数

  • 速度:默认情况下,bpgenc使用x265。你可以编译很多更慢但更高效的JCTVC编码器,并使用’-ejctvc’选项选择它。使用x265,您可以使用 '-m' 选项选择编码速度(1 =快速,但图像较大,9 =较慢但图像较小)。

  • 位深度:默认位深度为8.您可以将其增加到10( '-b 10' 选项)以略微提高压缩比。对于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选项 )。 对于图像压缩这个参数是比较重要的,它控制图像质量,取值范围[1,51],数值越高压缩率越大,图像质量越差。

  • 色彩空间和色度格式:

    *对于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

2. 解码

            
              bpgdec -o output.jpg input.bpg

            
          

BPG命令行解码器是 bpgdec 。 它输出PNG或PPM图像。 使用PPM输出以获得最快的速度。

  • 使用 '-i' 选项,您可以获得有关BPG图像的信息(并且不输出解码图像)。

  • '-b' 选项选择PNG输出的位深度(8或16)。 它独立于内部BPG位深度。

批量使用BPG

这里使用 os 库 中的 system 操作来调用外部命令。这里需要将代码 py文件 bpg-0.9.8-win64.zip 解压后的文件在同一文件夹,否则运行命令的时候需要使用绝对路径。

            
              
                import
              
               os

root_dir 
              
                =
              
              
                'D:\\Colorization_Set_test\\test_gray'
              
              
                for
              
               item 
              
                in
              
               os
              
                .
              
              listdir
              
                (
              
              root_dir
              
                )
              
              
                :
              
              
                # 遍历root_dir
              
              
        name 
              
                =
              
               root_dir 
              
                +
              
              
                '\\'
              
              
                +
              
               item   
              
                # 获取图片路径
              
              
        save_dir 
              
                =
              
              
                'D:\\Colorization_Set_test\\encode'
              
              
                +
              
              
                str
              
              
                (
              
              i
              
                )
              
              
                +
              
              
                '_bpg\\'
              
              
                # 存储编码结果
              
              
        save_dir1 
              
                =
              
              
                'D:\\Colorization_Set_test\\decode'
              
              
                +
              
              
                str
              
              
                (
              
              i
              
                )
              
              
                +
              
              
                '_bpg\\'
              
              
                # 存储解码结果
              
              
                if
              
              
                not
              
               os
              
                .
              
              path
              
                .
              
              exists
              
                (
              
              save_dir
              
                )
              
              
                :
              
              
            os
              
                .
              
              makedirs
              
                (
              
              save_dir
              
                )
              
              
                if
              
              
                not
              
               os
              
                .
              
              path
              
                .
              
              exists
              
                (
              
              save_dir1
              
                )
              
              
                :
              
              
            os
              
                .
              
              makedirs
              
                (
              
              save_dir1
              
                )
              
              

        os
              
                .
              
              system
              
                (
              
              
                'bpgenc -m 9 -b 8 -q 40 '
              
              
                +
              
               name 
              
                +
              
              
                ' -o '
              
              
                +
              
               save_dir 
              
                +
              
               item
              
                .
              
              split
              
                (
              
              
                '.'
              
              
                )
              
              
                [
              
              
                0
              
              
                ]
              
              
                +
              
              
                '.bpg'
              
              
                )
              
              
        os
              
                .
              
              system
              
                (
              
              
                'bpgdec -o '
              
              
                +
              
               save_dir1 
              
                +
              
               item
              
                .
              
              split
              
                (
              
              
                '.'
              
              
                )
              
              
                [
              
              
                0
              
              
                ]
              
              
                +
              
              
                '.jpg'
              
              
                +
              
              
                ' '
              
              
                +
              
               save_dir 
              
                +
              
               item
              
                .
              
              split
              
                (
              
              
                '.'
              
              
                )
              
              
                [
              
              
                0
              
              
                ]
              
              
                +
              
              
                '.bpg'
              
              
                )
              
            
          

更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论