跳转到主要内容

通过CharLS C++库为Python实现的JPEG-LS

项目描述

pyjpegls

注意
这是一个基于原始CharPyLS仓库的分支,创建这个分支是为了能够添加修复和适配,因为原始仓库已经不再维护。本文件的其余部分与原始readme文件相同。

通过CharLS C++库为Python实现的JPEG-LS

我编写了这个接口,以便能够轻松地从我的Python应用程序中访问出色的JPEG-LS无损图像压缩算法。我不需要读取/写入其他人的JPEG-LS图像文件,而是需要压缩应用程序内部的一些数据结构。这些数据在性质上类似于灰度图像,因此利用我在codeplex.com上找到的现有CharLS C++库是一个容易的选择。我最终还为我的一些单元测试添加了一些基本的文件I/O功能,这就是为什么我在下面列出Pillow作为依赖项的原因。

我已经在Windows 7 x64、Windows 8 x64和Ubuntu x64上测试了此代码。请注意,尽管这个包的名字有点奇怪“CharPyLS”,但您应该将其导入为“jpeg_ls”。以下是一个使用此工具将图像压缩到内存中的缓冲区的快速示例。有关更多详细信息,请查看源代码中包含的示例。

    # Read in an image from an existing PNG file.
    fname_img = 'test/image.png'
    data_image = data_io.read_PIL(fname_img)

    # Compress image data to a sequence of bytes.
    data_buffer = jpeg_ls.encode(data_image)

    # Sizes.
    size_png = os.path.getsize(fname_img)
    print('Size of RGB 8-bit image data:  {:n}'.format(len(data_image.tostring())))
    print('Size of PNG encoded data file: {:n}'.format(size_png))
    print('Size of JPEG-LS encoded data:  {:n}'.format(len(data_buffer)))

    # Decompress.
    data_image_b = jpeg_ls.decode(data_buffer)

    # Compare.
    is_same = (data_image == data_image_b).all()
    print('Restored data is identical to original: {:s}'.format(str(is_same)))

上述示例生成的输出应如下所示

Size of RGB 8-bit image data:  5038848
Size of PNG encoded data file: 2409950
Size of JPEG-LS encoded data:  2088357
Restored data is identical to original: True

关于JPEG-LS

  • 来自维基百科文章:JPEG-LS(ISO-14495-1/ITU-T.87)是一种从惠普LOCO算法派生出的被接受的无损图像压缩标准。
  • 来自CharLS codeplex网站:CharLS是对JPEG-LS标准进行优化的无损和近似无损图像压缩的实现。JPEG-LS是一个低复杂度的标准,与JPEG 2000压缩比率相匹配。在速度方面,CharLS优于开源和商业JPEG LS实现。

依赖项

  • Numpy
  • Cython(仅用于构建和安装,不是日常使用)
  • Pillow(PIL的友好分支,在本例中用于文件I/O示例和单元测试)
  • CharLS(源代码作为子文件夹包含)

支持者