Skip to main content

Python Bulk Image Compressor

PyPI Python Versions

py-bulk-image-compressor is a user-friendly CLI tool for compressing and resizing images in bulk. It offers extensive options for managing image quality, format, and metadata while maintaining fast, efficient performance.

terminal

Key Features

  • Supports Multiple Formats: JPEG, PNG, WEBP, AVIF, HEIF, and more.
  • Metadata Handling: Choose whether to preserve or remove EXIF data.
  • Multicore Processing: Utilizes all available CPU cores.
  • Flexible Settings: Customize output quality, max width, and destination directory.

Installation

From PyPI

pip install py-bulk-image-compressor

Requires Python 3.10+

From Source

  1. Clone the repository:
    git clone https://github.com/georgekhananaev/py-image-compressor.git
    cd py-image-compressor
    
  2. Install dependencies:
    pip install -r requirements.txt
    
  3. Install locally:
    pip install .
    
  4. Run the CLI:
    py-bulk-image-compressor -h
    

Usage

After installation, you can run:

py-bulk-image-compressor -h

Example Commands

  1. Basic compression and resize:

    py-bulk-image-compressor -l "path/to/original_images" -d "path/to/output"
    

    Uses default format (jpeg), quality=80, max_width=1920px.

  2. Specific format and quality:

    py-bulk-image-compressor -l "path/to/original_images" \
        -d "path/to/output" -f webp -w 800 -q 70
    
  3. Remove metadata & skip larger compressed files:

    py-bulk-image-compressor -l "path/to/original_images" \
        -d "path/to/output" -rm y -r y
    

Logs are saved to logs.txt in the current cmd/terminal working directory. Installation & Usage screenshot below:

terminal

Command-Line Options

Option Required Default Value Description
-l Yes (No Default) Input directory for original images. (Example: -l "C:/images/")
-d No /data/output/ Output directory for compressed images.
-f No jpeg Output format (e.g., webp, png, avif).
-w No 1920 Maximum width (px).
-q No 80 Image quality (0-100).
-r No n (off) Remove compressed if it’s larger than the original (-r y).
-rm No n (off) Remove all metadata (-rm y).

Logging

  • Generates or appends to a logs.txt file in your current working directory.
  • The configurations.ini file controls log settings (e.g., max_rows).

Contributing

  1. Fork the repository.
  2. Create a new branch: git checkout -b feature-name.
  3. Commit your changes: git commit -m "Add awesome feature".
  4. Push to your branch: git push origin feature-name.
  5. Open a pull request on GitHub.

License

This project is licensed under the MIT License.


Questions or Issues?

  • Open an issue on GitHub
  • Contributions, suggestions, and bug reports are welcome!

Support

If you find this tool helpful, consider supporting:

Buy Me A Coffee

Your support helps me continue to create and maintain useful projects.


Updates

13/04/2025

  1. Added JPEG normalization step to ensure consistent color‑space conversion and correct chroma placement.
  2. Upgraded compressor to use progressive encoding, optimized Huffman tables, and 4:2:0 subsampling by default for smaller output sizes.
  3. Added official support for Python 3.13.x.

27/01/2025

  1. Deployed to pypi, installation:
      pip install py-bulk-image-compressor
    
    usage:
      py-bulk-image-compressor -h
    

26/01/2025

  1. EXIF metadata is preserved if supported by the output format (e.g., JPEG).
  2. Added support for .avif format (requires pillow-avif-plugin).
  3. Minor speed optimizations for faster compression.
  4. Updated requirements.txt with the latest package versions.
  5. Added logs, which is exported to logs.txt
  6. Added tests, use
      pytest --maxfail=1 --disable-warnings -v
    

02/12/2023

  1. Automatic detection and handling of RGB/RGBA channels.
  2. Thanks to "ZenithVal" for the suggestion.

06/04/2023

  1. Updated README.md.
  2. Updated requirements.txt with the latest package versions.

12/12/2022

  1. Introduced a resources folder containing configurations.ini for storing program settings.
  2. Set up future GUI plans using customtkinter.
  3. Removed PySimpleGUI from dependencies.

06/12/2022

  1. Default values added for -d, -f, and -q options. You can run:
    python main.py -l "C:/Your Folder/"
    
    Defaults: JPEG format, 80% quality, 1920px max width, /data/output/ as the destination folder.
  2. Simplified the code using *args and **kwargs.

05/12/2022

  1. Added support for .heif and .heic formats (e.g., iPhone photos).
  2. Updated requirements.txt to include pillow-heif.

04/12/2022

  1. Improved the output to display the actual size saved for each image, with full multithreading conversion support.
  2. Enhanced terminal output for better visualization of size savings.
  3. Began GUI development for Windows and Ubuntu.
  4. Added -r y to skip retaining larger compressed images.

Metadata

Release files for py-bulk-image-compressor 1.0.8

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

Source distribution (sdist)

Source distribution for py-bulk-image-compressor 1.0.8
File Size Uploaded
py_bulk_image_compressor-1.0.8.tar.gz 15.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for py-bulk-image-compressor 1.0.8
File Interpreter ABI Platform
py_bulk_image_compressor-1.0.8-py3-none-any.whl Python 3 none any Details

Total release size: 31.8 kB

Release files / py_bulk_image_compressor-1.0.8.tar.gz

Download URL py_bulk_image_compressor-1.0.8.tar.gz
Size 15.1 kB
Tags Source
SHA-256 checksum
How to use checksums
22533d3c98276cdc081fb394ad1df472f3ad1d75c755d79c46f48dd9b8742624
BLAKE2b-256 checksum
How to use checksums
c71bbd8aa23c9359ce1fb6d785f994dfe103902b494f438862881e1c9fd65f5d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.12.9

Release files / py_bulk_image_compressor-1.0.8-py3-none-any.whl

Download URL py_bulk_image_compressor-1.0.8-py3-none-any.whl
Size 16.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
fb38cdbcf1eaba68fad8c36d99bffb7569366820a72592547d9ea790d75a7121
BLAKE2b-256 checksum
How to use checksums
85aa8a71adce4808c454da91970a0a2c7f4e514dd0f4022a42cf2698621886e8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.12.9

Release history Release notifications | RSS feed

This release

1.0.8 This release

2 release files

1.0.7

2 release files

1.0.6

2 release files

1.0.5

2 release files

1.0.4

2 release files

1.0.3

2 release files

1.0.2

2 release files

1.0.1

2 release files

1.0.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