Skip to content
JPEG-LS for Python via CharLS C++ Library
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.
jpeg_ls remove mistake Feb 18, 2018
.gitignore copied around Oct 11, 2013 new file Feb 18, 2018
license.txt copied around Oct 11, 2013 update comment about use of Pillow Feb 13, 2014
requirements.txt add Pillow to requirements Feb 18, 2018 remove platform-specfic compiler args Feb 18, 2018


JPEG-LS for Python via CharLS C++ Library

I wrote this interface to enable easy access to the awesome JPEG-LS lossless image compression algorithm from within my Python application. I had no need to read/write anyone else's JPEG-LS image files, but rather I needed to compress some data structures internal to my application. This data was similar in nature to greyscale imagery such that it was an easy choice to leverage the existing CharLS C++ library I found on I did eventually incorporate some basic file I/O functionality for my unit tests, and that's why I list Pillow below as a dependency.

I have tested this code on Windows 7 x64, Windows 8 x64, and Ubuntu x64. Note, even though this package has the odd name "CharPyLS", you will import it into your module as "jpeg_ls". Here is a quick example of using this tool to compress an image to a buffer in memory. For more details, check out the examples included within the source code.

    # 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)))

The output generated by the above example should look like the following:

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


  • From Wikipedia article: JPEG-LS (ISO-14495-1/ITU-T.87) is an accepted lossless image compression standard derived from the Hewlett Packard LOCO algorithm.
  • From CharLS codeplex site: CharLS is an optimized implementation of the JPEG-LS standard for lossless and near-lossless image compression. JPEG-LS is a low-complexity standard that matches JPEG 2000 compression ratios. In terms of speed, CharLS outperforms open source and commercial JPEG LS implementations.


  • Numpy
  • Cython (only for building and installing, not for everyday use)
  • Pillow (friendly fork of PIL, used here for file I/O with the example and during unit tests)
  • CharLS (source included as subfolder)
You can’t perform that action at this time.