Skip to main content

Optimize JPEGs losslessly using MozJPEG

Project description

Github Discord PYPI Version Build Status Black License

This library optimizes JPEGs losslessly using MozJPEG.

To reduce the file sizes,

  • the Huffman table of the JPEGs is optimized,

  • the baseline JPEGs are converted to progressive JPEGs,

  • and any metadata and ICC profiles are removed.

The JPEGs optimized with this library are identical to what you get using the jpegtran tool from MozJPEG with the -optimize, -progressive and -copy none options.

Usage

Optimizing (losslessly) a JPEG:

import mozjpeg_lossless_optimization

with open("./image.jpg", "rb") as input_jpeg_file:
    input_jpeg_bytes = input_jpeg_file.read()

output_jpeg_bytes = mozjpeg_lossless_optimization.optimize(input_jpeg_bytes)

with open("./out.jpg", "wb") as output_jpeg_file:
    output_jpeg_file.write(output_jpeg_bytes)

Converting an image to an optimized JPEG (using Pillow):

from io import BytesIO

from PIL import Image  # pip install pillow
import mozjpeg_lossless_optimization


def convert_to_optimized_jpeg(input_path, output_path):
    jpeg_io = BytesIO()

    with Image.open(input_path, "r") as image:
        image.convert("RGB").save(jpeg_io, format="JPEG", quality=90)

    jpeg_io.seek(0)
    jpeg_bytes = jpeg_io.read()

    optimized_jpeg_bytes = mozjpeg_lossless_optimization.optimize(jpeg_bytes)

    with open(output_path, "wb") as output_file:
        output_file.write(optimized_jpeg_bytes)


convert_to_optimized_jpeg("input.png", "optimized.jpg")

Install

From PyPI

To install MozJPEG Lossless Optimization from PyPI, just run the following command:

pip install mozjpeg-lossless-optimization

From Sources

To install MozJPEG Lossless Optimization, MozJPEG will be compiled, so you will need a C compilator and cmake. On Debian / Ubuntu you can install everything you need with the following command:

sudo apt install build-essential cmake python3 python3-dev python3-pip python3-setuptools

Once everything installed, clone this repository:

git clone https://github.com/wanadev/mozjpeg-lossless-optimization.git

Then navigate to the project’s folder:

cd mozjpeg-lossless-optimization

Retrieve submodules:

git submodule init
git submodule update

And finally build and install using the following command:

python3 setup.py install

Hacking

Get the source and build C lib and module:

# Install system dependencies
sudo apt install build-essential cmake python3 python3-dev python3-pip python3-setuptools

# Get the sources
git clone https://github.com/wanadev/mozjpeg-lossless-optimization.git
cd mozjpeg-lossless-optimization
git submodule init
git submodule update

# Create and activate a Python virtualenv
python3 -m venv __env__
source __env__/bin/activate

# Install Python dependencies in the virtualenv
pip install cffi

# Build MozJPEG
# This will generate files in ./mozjpeg/build/ folder
python setup.py build

# Build the CFFI module "in-place"
# This will create the ./mozjpeg_lossless_optimization/_mozjpeg_opti.*.so file on Linux
python ./mozjpeg_lossless_optimization/mozjpeg_opti_build.py

Lint:

pip install nox
nox -s lint

Run tests:

pip install nox
pip -s test

Licenses

MozJPEG Lossless Optimization is licensed under the BSD 3 Clause license. See the LICENSE file for more information.

MozJPEG is covered by three compatible BSD-style open source licenses. See its license file for more information.

Changelog

  • [NEXT] (changes on master but not released yet):

    • Nothing yet ;)

  • v1.1.3:

    • Added Python 3.12 support (@flozz, #6)

    • Removed Python 3.7 support (@flozz)

  • v1.1.2:

    • Added Python 3.11 support

  • v1.1.1:

    • Fix sdist package: missing MozJPEG source files added

  • v1.1.0:

    • Update mozjpeg to latest master commit: fd56921 (v4.1.1+)

  • v1.0.2:

    • arm64 and universal2 wheels for macOS on Apple Silicon

    • x86 and x68_64 wheels for musl-based Linux distro (Alpine,…)

  • v1.0.1: Python 3.10 support and wheels

  • v1.0.0: Handle JPEG decompression errors

  • v0.9.0: First public release

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mozjpeg-lossless-optimization-1.1.3.tar.gz (1.0 MB view hashes)

Uploaded Source

Built Distributions

mozjpeg_lossless_optimization-1.1.3-cp312-cp312-win_amd64.whl (59.1 kB view hashes)

Uploaded CPython 3.12 Windows x86-64

mozjpeg_lossless_optimization-1.1.3-cp312-cp312-musllinux_1_1_x86_64.whl (105.1 kB view hashes)

Uploaded CPython 3.12 musllinux: musl 1.1+ x86-64

mozjpeg_lossless_optimization-1.1.3-cp312-cp312-musllinux_1_1_i686.whl (103.7 kB view hashes)

Uploaded CPython 3.12 musllinux: musl 1.1+ i686

mozjpeg_lossless_optimization-1.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (132.2 kB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

mozjpeg_lossless_optimization-1.1.3-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl (104.3 kB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.12+ i686 manylinux: glibc 2.17+ i686

mozjpeg_lossless_optimization-1.1.3-cp312-cp312-macosx_11_0_arm64.whl (10.1 kB view hashes)

Uploaded CPython 3.12 macOS 11.0+ ARM64

mozjpeg_lossless_optimization-1.1.3-cp312-cp312-macosx_10_9_x86_64.whl (76.9 kB view hashes)

Uploaded CPython 3.12 macOS 10.9+ x86-64

mozjpeg_lossless_optimization-1.1.3-cp312-cp312-macosx_10_9_universal2.whl (81.1 kB view hashes)

Uploaded CPython 3.12 macOS 10.9+ universal2 (ARM64, x86-64)

mozjpeg_lossless_optimization-1.1.3-cp311-cp311-win_amd64.whl (59.0 kB view hashes)

Uploaded CPython 3.11 Windows x86-64

mozjpeg_lossless_optimization-1.1.3-cp311-cp311-musllinux_1_1_x86_64.whl (104.7 kB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.1+ x86-64

mozjpeg_lossless_optimization-1.1.3-cp311-cp311-musllinux_1_1_i686.whl (103.5 kB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.1+ i686

mozjpeg_lossless_optimization-1.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (131.9 kB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

mozjpeg_lossless_optimization-1.1.3-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl (104.1 kB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.12+ i686 manylinux: glibc 2.17+ i686

mozjpeg_lossless_optimization-1.1.3-cp311-cp311-macosx_11_0_arm64.whl (10.1 kB view hashes)

Uploaded CPython 3.11 macOS 11.0+ ARM64

mozjpeg_lossless_optimization-1.1.3-cp311-cp311-macosx_10_9_x86_64.whl (76.9 kB view hashes)

Uploaded CPython 3.11 macOS 10.9+ x86-64

mozjpeg_lossless_optimization-1.1.3-cp311-cp311-macosx_10_9_universal2.whl (81.1 kB view hashes)

Uploaded CPython 3.11 macOS 10.9+ universal2 (ARM64, x86-64)

mozjpeg_lossless_optimization-1.1.3-cp310-cp310-win_amd64.whl (59.0 kB view hashes)

Uploaded CPython 3.10 Windows x86-64

mozjpeg_lossless_optimization-1.1.3-cp310-cp310-musllinux_1_1_x86_64.whl (104.7 kB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ x86-64

mozjpeg_lossless_optimization-1.1.3-cp310-cp310-musllinux_1_1_i686.whl (103.5 kB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ i686

mozjpeg_lossless_optimization-1.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (131.9 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

mozjpeg_lossless_optimization-1.1.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl (104.1 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.12+ i686 manylinux: glibc 2.17+ i686

mozjpeg_lossless_optimization-1.1.3-cp310-cp310-macosx_11_0_arm64.whl (10.1 kB view hashes)

Uploaded CPython 3.10 macOS 11.0+ ARM64

mozjpeg_lossless_optimization-1.1.3-cp310-cp310-macosx_10_9_x86_64.whl (76.9 kB view hashes)

Uploaded CPython 3.10 macOS 10.9+ x86-64

mozjpeg_lossless_optimization-1.1.3-cp310-cp310-macosx_10_9_universal2.whl (81.1 kB view hashes)

Uploaded CPython 3.10 macOS 10.9+ universal2 (ARM64, x86-64)

mozjpeg_lossless_optimization-1.1.3-cp39-cp39-win_amd64.whl (59.0 kB view hashes)

Uploaded CPython 3.9 Windows x86-64

mozjpeg_lossless_optimization-1.1.3-cp39-cp39-musllinux_1_1_x86_64.whl (104.7 kB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ x86-64

mozjpeg_lossless_optimization-1.1.3-cp39-cp39-musllinux_1_1_i686.whl (103.5 kB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ i686

mozjpeg_lossless_optimization-1.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (131.9 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

mozjpeg_lossless_optimization-1.1.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl (104.1 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.12+ i686 manylinux: glibc 2.17+ i686

mozjpeg_lossless_optimization-1.1.3-cp39-cp39-macosx_11_0_arm64.whl (10.1 kB view hashes)

Uploaded CPython 3.9 macOS 11.0+ ARM64

mozjpeg_lossless_optimization-1.1.3-cp39-cp39-macosx_10_9_x86_64.whl (76.9 kB view hashes)

Uploaded CPython 3.9 macOS 10.9+ x86-64

mozjpeg_lossless_optimization-1.1.3-cp39-cp39-macosx_10_9_universal2.whl (81.1 kB view hashes)

Uploaded CPython 3.9 macOS 10.9+ universal2 (ARM64, x86-64)

mozjpeg_lossless_optimization-1.1.3-cp38-cp38-win_amd64.whl (59.0 kB view hashes)

Uploaded CPython 3.8 Windows x86-64

mozjpeg_lossless_optimization-1.1.3-cp38-cp38-musllinux_1_1_x86_64.whl (105.1 kB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ x86-64

mozjpeg_lossless_optimization-1.1.3-cp38-cp38-musllinux_1_1_i686.whl (103.9 kB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ i686

mozjpeg_lossless_optimization-1.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (132.0 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

mozjpeg_lossless_optimization-1.1.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl (104.2 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.12+ i686 manylinux: glibc 2.17+ i686

mozjpeg_lossless_optimization-1.1.3-cp38-cp38-macosx_11_0_arm64.whl (10.1 kB view hashes)

Uploaded CPython 3.8 macOS 11.0+ ARM64

mozjpeg_lossless_optimization-1.1.3-cp38-cp38-macosx_10_9_x86_64.whl (76.9 kB view hashes)

Uploaded CPython 3.8 macOS 10.9+ x86-64

mozjpeg_lossless_optimization-1.1.3-cp38-cp38-macosx_10_9_universal2.whl (81.1 kB view hashes)

Uploaded CPython 3.8 macOS 10.9+ universal2 (ARM64, x86-64)

mozjpeg_lossless_optimization-1.1.3-cp37-cp37m-win_amd64.whl (59.0 kB view hashes)

Uploaded CPython 3.7m Windows x86-64

mozjpeg_lossless_optimization-1.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl (104.6 kB view hashes)

Uploaded CPython 3.7m musllinux: musl 1.1+ x86-64

mozjpeg_lossless_optimization-1.1.3-cp37-cp37m-musllinux_1_1_i686.whl (103.4 kB view hashes)

Uploaded CPython 3.7m musllinux: musl 1.1+ i686

mozjpeg_lossless_optimization-1.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (131.8 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64

mozjpeg_lossless_optimization-1.1.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl (104.0 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.12+ i686 manylinux: glibc 2.17+ i686

mozjpeg_lossless_optimization-1.1.3-cp37-cp37m-macosx_10_9_x86_64.whl (76.8 kB view hashes)

Uploaded CPython 3.7m macOS 10.9+ x86-64

mozjpeg_lossless_optimization-1.1.3-cp36-cp36m-win_amd64.whl (59.2 kB view hashes)

Uploaded CPython 3.6m Windows x86-64

mozjpeg_lossless_optimization-1.1.3-cp36-cp36m-musllinux_1_1_x86_64.whl (104.6 kB view hashes)

Uploaded CPython 3.6m musllinux: musl 1.1+ x86-64

mozjpeg_lossless_optimization-1.1.3-cp36-cp36m-musllinux_1_1_i686.whl (103.4 kB view hashes)

Uploaded CPython 3.6m musllinux: musl 1.1+ i686

mozjpeg_lossless_optimization-1.1.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (131.8 kB view hashes)

Uploaded CPython 3.6m manylinux: glibc 2.17+ x86-64

mozjpeg_lossless_optimization-1.1.3-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl (104.0 kB view hashes)

Uploaded CPython 3.6m manylinux: glibc 2.12+ i686 manylinux: glibc 2.17+ i686

mozjpeg_lossless_optimization-1.1.3-cp36-cp36m-macosx_10_9_x86_64.whl (76.8 kB view hashes)

Uploaded CPython 3.6m macOS 10.9+ x86-64

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page