Skip to main content

picx

picx is a small Python image optimization package for web assets, blogs, avatars, and batch cleanup jobs. The package installs a CLI named picx and exposes a compact Python API under picx.

Features

  • Compress single images or entire directories.
  • Convert between jpg, png, webp, avif, and tiff outputs.
  • Read jpg, jpeg, png, webp, avif, tif, and tiff inputs.
  • Resize with max_width and max_height.
  • Strip image metadata by default.
  • Search for the highest quality under a target byte size.
  • Render CLI compression reports with Rich.
  • Use web, blog, avatar, and lossless presets.

Install

Install from PyPI:

pip install picx-image-optimizer

Install from source:

git clone https://github.com/ingeniousfrog/picx.git
cd picx
pip install .

For local development:

pip install -e ".[dev]"

pip install picx-image-optimizer installs the pyvips Python backend package. pyvips also needs the native libvips system library for large-image processing. pip cannot install this native system library for every platform, so install it once with your OS or environment package manager:

brew install vips
# or
conda install -c conda-forge libvips pyvips

Install libvips in the same environment that runs picx. For example, if you run picx inside conda activate comfyui, install libvips inside that conda environment. Mixing Homebrew libvips with Anaconda/conda libraries can still fail on macOS with dynamic-library or code-signature errors.

CLI

Optimize one image:

picx image ./photo.png --output ./dist/photo.webp --format webp --quality 82

Optimize a directory recursively while preserving relative paths:

picx dir ./images ./out --format webp --preset web

Try a target size in bytes:

picx image ./hero.jpg --output ./out/hero.webp --format webp --target-size 120000

Handle trusted large images with Pillow:

picx image ./texture.tif --output ./texture.webp --format webp --allow-large --max-pixels 400000000

Use the pyvips backend for large images:

picx image ./texture.tif --output ./texture.webp --format webp --backend pyvips

WebP has a per-side dimension limit of 16383 pixels. If either width or height is larger, resize first or use tiling:

picx image ./texture.tif --output ./texture.webp --format webp --backend pyvips --max-height 16000

Create tiles and a manifest for very large images:

picx tile ./texture.tif ./tiles --tile-size 1024 --format webp

Python API

from picx import optimize_dir, optimize_image, tile_image

single = optimize_image(
    "photo.png",
    output="dist/photo.webp",
    format="webp",
    quality=82,
    max_width=1600,
    strip_meta=True,
)

batch = optimize_dir(
    "images",
    "out",
    format="webp",
    preset="blog",
    recursive=True,
)

tiles = tile_image("texture.tif", "tiles", tile_size=1024, format="webp")

optimize_image() and optimize_dir() return OptimizeResult objects with:

  • original_size
  • output_size
  • savings_ratio
  • skipped
  • error
  • source_path
  • output_path

Presets

Preset Output Purpose
web webp, quality 82, max width 1920 General website images
blog webp, quality 78, max width 1600 Blog and article images
avatar webp, quality 85, max 256 x 256 Profile images
lossless png, quality 100 Lossless-ish cleanup with metadata stripping

Development

python3 -m pytest

picx uses Pillow by default and includes the pyvips Python backend package. The pyvips backend also requires the native libvips system library, which pip does not install automatically. Install libvips in the same environment that runs picx.

Large Images

By default, picx keeps Pillow's large-image safety posture. If an image exceeds the configured pixel limit, picx reports a clear error with next steps instead of showing a raw traceback. For trusted images, use --allow-large and optionally set --max-pixels. For memory-efficient processing, install system libvips and select --backend pyvips or keep the default --backend auto.

For single-file WebP output, keep both width and height at or below 16383 pixels. Images larger than that should be resized with --max-width / --max-height, or exported with picx tile instead.

picx tile writes image tiles plus manifest.json. The manifest is an index, not a merged image: it records the original size, tile size, output format, levels, and every tile's path and coordinates so another tool can display or reconstruct the tile layout reliably.

Metadata

Release files for picx-image-optimizer 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for picx-image-optimizer 0.1.1
File Size Uploaded
picx_image_optimizer-0.1.1.tar.gz 20.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for picx-image-optimizer 0.1.1
File Interpreter ABI Platform
picx_image_optimizer-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 41.8 kB

Release files / picx_image_optimizer-0.1.1.tar.gz

Download URL picx_image_optimizer-0.1.1.tar.gz
Size 20.9 kB
Tags Source
SHA-256 checksum
How to use checksums
340e2b259ce3c8d46419e8fa0f2c980c5d783f6601cac8740461b3eaf12921d9
BLAKE2b-256 checksum
How to use checksums
02e1ed75d897762efffed91c141883b57e4a2e0dc7ce2d653587fbe2c01df558
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jun 17, 2026.

Transparency log

Release files / picx_image_optimizer-0.1.1-py3-none-any.whl

Download URL picx_image_optimizer-0.1.1-py3-none-any.whl
Size 20.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1b0c8cab42563303b9669efbd15ea6ef89737d780f74787e1a48b7fe099ea8cc
BLAKE2b-256 checksum
How to use checksums
98cc443250232302f7c530e921806077c25cbad1ea902bd1e3f0fd0eb6750c24
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jun 17, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page