Skip to main content

Python wrapper for multithreaded .png image file optimizer oxipng

Project description

pyoxipng

CI PyPI

Python wrapper for multithreaded .png image file optimizer oxipng (written in Rust). Use pyoxipng to reduce the file size of your PNG images.

Jump to a section

Installation

Install from PyPI:

pip install pyoxipng

Import in your Python code:

import oxipng

Usage

To optimize an existing file on disk:

oxipng.optimize("/path/to/image.png", "/path/to/image-optimized.png")

Second argument is optional; if not provided, will overwrite the existing file.

To optimize a file already-loaded in Python as a bytes object:

data = ...  # bytes of png data

optimized_data = oxipng.optimize_from_memory(data)

# Save the result
with open("/path/to/image-optimized.png", "wb") as f:
    f.write(optimized_data)

Both functions raise oxipng.PngError if the optimization cannot be completed.

Options

Both the optimize and optimize_from_memory functions accept the following options as keyword arguments.

Example usage:

oxipng.optimize("/path/to/image.png", level=6, backup=True, interlace=1)
Option Description Type Default
level Set the optimization level to an integer between 0 and 6 (inclusive) int 2
backup Whether the input file should be backed up before writing the output bool False
fix_errors Attempt to fix errors when decoding the input file rather than throwing PngError bool False
check Don't actually run any optimizations, just parse the PNG file bool False
pretend Don't actually write any output file, just calculate the best results bool False
force Write to output even if there was no improvement in compression bool False
preserve_attrs Ensure the output file has the same permissions as the input file bool False
filter Which filters to try on the file. Use Use enum values from oxipng.RowFilter set=[RowFilter.NoOp] {RowFilter.NoOp}
interlace Whether to change the interlacing type of the file. None will not change current interlacing type Interlacing | None None
optimize_alpha Whether to allow transparent pixels to be altered to improve compression bool False
bit_depth_reduction Whether to attempt bit depth reduction bool True
color_type_reduction Whether to attempt color type reduction bool True
palette_reduction Whether to attempt palette reduction bool True
grayscale_reduction Whether to attempt grayscale reduction bool True
idat_recoding If any type of reduction is performed, IDAT recoding will be performed regardless of this setting bool True
strip Which headers to strip from the PNG file, if any. Specify with oxipng.Headers Headers Headers.none()
deflate Which DEFLATE algorithm to use. Specify with oxipng.Deflaters Deflaters Deflaters.libdeflater()
use_heuristics Whether to use heuristics to pick the best filter and compression. Intended for use with level=1 bool False
timeout Maximum amount of time to spend (in milliseconds) on optimizations. Further potential optimizations are skipped if the timeout is exceeded int | None None

filter

Initialize the filter set with any of the following enum options:

  • oxipng.RowFilter.NoOp
  • oxipng.RowFilter.Sub
  • oxipng.RowFilter.Up
  • oxipng.RowFilter.Average
  • oxipng.RowFilter.Paeth
  • oxipng.RowFilter.Bigrams
  • oxipng.RowFilter.BigEnt
  • oxipng.RowFilter.Brute

interlace

Set interlace to None to keep existing interlacing or to one of following enum options:

  • oxipng.Interlacing.Off (interlace disabled)
  • oxipng.Interlacing.Adam7 (interlace enabled)

strip

Initialize the strip option with one of the following static methods in the oxipng.Headers class.

Method Description
oxipng.Headers.none() None
oxipng.Headers.strip(list[str]) Remove specific chunks
oxipng.Headers.safe() Headers that won't affect rendering (all but cHRM, gAMA, iCCP, sBIT, sRGB, bKGD, hIST, pHYs, sPLT)
oxipng.Headers.keep(set[str]) Remove all non-critical chunks except these
oxipng.Headers.all() All non-critical headers

deflate

Initialize the deflate option with one of the following static methods in the oxipng.Deflaters class.

Method Description
oxipng.Deflaters.libdeflater(int) Libdeflater with compression level [0-12]
oxipng.Deflaters.zopfli(int) Zopfli with number of compression iterations to do [1-255].

Development

  1. Install Rust
  2. Install Python 3.8+
  3. Install Pipenv
  4. Clone this repository and navigate to it via command line
    git clone https://github.com/nfrasser/pyoxipng.git
    cd pyoxipng
    
  5. Install dependencies
    pipenv install --dev
    
  6. Activate the dev environment
    pipenv shell
    
  7. Build
    maturin develop
    
  8. Run tests
    pytest
    
  9. Format code
    black .
    

License

MIT

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

pyoxipng-8.0.1.tar.gz (305.0 kB view hashes)

Uploaded Source

Built Distributions

pyoxipng-8.0.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

pyoxipng-8.0.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.8 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ s390x

pyoxipng-8.0.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.7 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ppc64le

pyoxipng-8.0.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.5 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARMv7l

pyoxipng-8.0.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.5 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARM64

pyoxipng-8.0.1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl (1.6 MB view hashes)

Uploaded PyPy manylinux: glibc 2.12+ i686

pyoxipng-8.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

pyoxipng-8.0.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.8 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ s390x

pyoxipng-8.0.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.7 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ppc64le

pyoxipng-8.0.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.5 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARMv7l

pyoxipng-8.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.5 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARM64

pyoxipng-8.0.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl (1.6 MB view hashes)

Uploaded PyPy manylinux: glibc 2.12+ i686

pyoxipng-8.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

pyoxipng-8.0.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.8 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ s390x

pyoxipng-8.0.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.7 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ppc64le

pyoxipng-8.0.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.5 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARMv7l

pyoxipng-8.0.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.5 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARM64

pyoxipng-8.0.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl (1.6 MB view hashes)

Uploaded PyPy manylinux: glibc 2.12+ i686

pyoxipng-8.0.1-cp312-none-win_amd64.whl (415.4 kB view hashes)

Uploaded CPython 3.12 Windows x86-64

pyoxipng-8.0.1-cp312-none-win32.whl (389.2 kB view hashes)

Uploaded CPython 3.12 Windows x86

pyoxipng-8.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

pyoxipng-8.0.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.7 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ s390x

pyoxipng-8.0.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.7 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ppc64le

pyoxipng-8.0.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.5 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARMv7l

pyoxipng-8.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.5 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARM64

pyoxipng-8.0.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl (1.6 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.12+ i686

pyoxipng-8.0.1-cp312-cp312-macosx_11_0_arm64.whl (572.1 kB view hashes)

Uploaded CPython 3.12 macOS 11.0+ ARM64

pyoxipng-8.0.1-cp312-cp312-macosx_10_7_x86_64.whl (609.9 kB view hashes)

Uploaded CPython 3.12 macOS 10.7+ x86-64

pyoxipng-8.0.1-cp311-none-win_amd64.whl (414.7 kB view hashes)

Uploaded CPython 3.11 Windows x86-64

pyoxipng-8.0.1-cp311-none-win32.whl (389.0 kB view hashes)

Uploaded CPython 3.11 Windows x86

pyoxipng-8.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

pyoxipng-8.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.8 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ s390x

pyoxipng-8.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.7 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ppc64le

pyoxipng-8.0.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.5 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARMv7l

pyoxipng-8.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.5 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

pyoxipng-8.0.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl (1.6 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.12+ i686

pyoxipng-8.0.1-cp311-cp311-macosx_11_0_arm64.whl (571.7 kB view hashes)

Uploaded CPython 3.11 macOS 11.0+ ARM64

pyoxipng-8.0.1-cp311-cp311-macosx_10_7_x86_64.whl (610.3 kB view hashes)

Uploaded CPython 3.11 macOS 10.7+ x86-64

pyoxipng-8.0.1-cp310-none-win_amd64.whl (414.7 kB view hashes)

Uploaded CPython 3.10 Windows x86-64

pyoxipng-8.0.1-cp310-none-win32.whl (389.0 kB view hashes)

Uploaded CPython 3.10 Windows x86

pyoxipng-8.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

pyoxipng-8.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.8 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ s390x

pyoxipng-8.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.7 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ppc64le

pyoxipng-8.0.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.5 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARMv7l

pyoxipng-8.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.5 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

pyoxipng-8.0.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl (1.6 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.12+ i686

pyoxipng-8.0.1-cp310-cp310-macosx_11_0_arm64.whl (571.7 kB view hashes)

Uploaded CPython 3.10 macOS 11.0+ ARM64

pyoxipng-8.0.1-cp310-cp310-macosx_10_7_x86_64.whl (610.3 kB view hashes)

Uploaded CPython 3.10 macOS 10.7+ x86-64

pyoxipng-8.0.1-cp39-none-win_amd64.whl (414.8 kB view hashes)

Uploaded CPython 3.9 Windows x86-64

pyoxipng-8.0.1-cp39-none-win32.whl (389.9 kB view hashes)

Uploaded CPython 3.9 Windows x86

pyoxipng-8.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

pyoxipng-8.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.8 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ s390x

pyoxipng-8.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.7 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ppc64le

pyoxipng-8.0.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.5 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARMv7l

pyoxipng-8.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.5 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

pyoxipng-8.0.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl (1.6 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.12+ i686

pyoxipng-8.0.1-cp39-cp39-macosx_11_0_arm64.whl (572.4 kB view hashes)

Uploaded CPython 3.9 macOS 11.0+ ARM64

pyoxipng-8.0.1-cp39-cp39-macosx_10_7_x86_64.whl (610.7 kB view hashes)

Uploaded CPython 3.9 macOS 10.7+ x86-64

pyoxipng-8.0.1-cp38-none-win_amd64.whl (414.5 kB view hashes)

Uploaded CPython 3.8 Windows x86-64

pyoxipng-8.0.1-cp38-none-win32.whl (389.0 kB view hashes)

Uploaded CPython 3.8 Windows x86

pyoxipng-8.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

pyoxipng-8.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.8 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ s390x

pyoxipng-8.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.7 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ppc64le

pyoxipng-8.0.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.5 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARMv7l

pyoxipng-8.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.5 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

pyoxipng-8.0.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl (1.6 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.12+ i686

pyoxipng-8.0.1-cp38-cp38-macosx_11_0_arm64.whl (572.5 kB view hashes)

Uploaded CPython 3.8 macOS 11.0+ ARM64

pyoxipng-8.0.1-cp38-cp38-macosx_10_7_x86_64.whl (610.5 kB view hashes)

Uploaded CPython 3.8 macOS 10.7+ 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