In short

Pillow review: Pillow 13.0.0 exported six WebP covers below 100,000 bytes each in our test. Checks also passed for format, dimensions, EXIF rotation, transparency and metadata. This supports its use in a scripted image pipeline. A quality setting alone does not guarantee file size, so the encoded output must be measured and visually reviewed.

8.5/10

Verdict

8.5/10 for the tested small image pipeline. Byte validation and visual review remain part of the workflow.

Pros

  • Six WebP files below the byte limit
  • EXIF and alpha fixtures executed
  • Small and understandable Python workflow

Cons

  • No complete editorial interface
  • Colour profiles, animation and load require separate work
  • Six actual covers measured between 79,726 and 94,634 bytes.

  • The pipeline checks the encoded byte count.

  • Transparency and orientation were separate executed fixtures.

What did the Pillow review process?

This Pillow review opened, resized and encoded the six AI-generated originals used for Byte Dossier's first article series. The Linux environment used Pillow 13.0.0, Python 3.12.14, libwebp 1.6.0 and libavif 1.4.2. Images were fitted within 1200 × 675 pixels and exported without unnecessary metadata.

The encoder started at quality 88 and decreased in steps of two until the file was below 98,000 bytes, leaving room below the required 100,000-byte limit. All six images met that internal target. This does not imply identical visual quality across images: artefacts depend on the subject and display size.

Which files were produced?

Subject

Dimensions

Quality

File size

Agency selection

1199 × 675

88

83,442 bytes

GEO and SEO

1199 × 675

88

79,726 bytes

AI visibility

1199 × 675

88

94,346 bytes

Image formats

1199 × 675

76

90,992 bytes

Static search

1199 × 675

88

94,634 bytes

Image pipeline

1199 × 675

80

92,072 bytes

The 1199-pixel width results from proportional fitting rather than stretching an edge to 1200 pixels. Sizes were read from the saved files, not estimated before encoding.

Pillow review: Validated image pipeline: EXIF orientation, resizing, WebP output and final file validation.
Original Byte Dossier graphic. Own test of 13 November 2026; setup and limitations explained in the text. Byte Dossier · eigene Grafik / original graphic

What else was checked?

Six checks passed: every cover below 100,000 bytes, valid WebP decoding, maximum dimensions respected, a transparent corner retained in a separate RGBA fixture, correct rotation of an EXIF-orientation-6 JPEG, and no EXIF metadata in the six covers. The transparency fixture used lossless WebP and was separate from the RGB cover exports.

The orientation fixture started as an 80 × 40-pixel JPEG. After applying its orientation, the expected dimensions were 40 × 80 pixels. This exact condition was checked. It matters because resizing alone does not necessarily correct an image stored with an orientation tag.

What does a minimal export look like?

This pattern handles static RGB images. It deliberately stops if the byte target cannot be met within the allowed quality range. It is not a complete production upload handler and does not cover colour-profile conversion or animation.

from PIL import Image, ImageOps
from io import BytesIO
from pathlib import Path

with Image.open('original.png') as original:
    image = ImageOps.exif_transpose(original).convert('RGB')
    image.thumbnail((1200, 675), Image.Resampling.LANCZOS)
    for quality in range(88, 39, -2):
        output = BytesIO()
        image.save(output, 'WEBP', quality=quality, method=6)
        if output.tell() < 98000:
            Path('export.webp').write_bytes(output.getvalue())
            break
    else:
        raise ValueError('File budget not reached')

What remains your responsibility?

Pillow is a programmable library, not a managed editorial workflow. An application must decide allowed formats, pixel limits, colour handling and treatment of animations. Converting an RGBA image to RGB removes transparency, so the simplified example must not be used for transparent assets without adaptation.

This test covers export functions and byte limits. It does not evaluate millions of files, concurrent server operation or a representative camera-photo corpus. Fine text and hard colour edges deserve separate visual inspection.

Why is the score 8.5 out of 10?

The editorial criteria are reproducibility 9, tested export functions 9, byte-budget control 8 and production-integration effort 8. The unweighted mean is 8.5. Pillow fits the tested small scripted workflow well. A team needing a visual interface or fully managed media platform has additional requirements to assess.

Cover: AI-generated thematic illustration, not an actual photograph.

Which articles help with the next decision?

Frequently asked questions

Does quality 80 guarantee less than 100 KB?

No. Subject and dimensions affect the encoded size. Measure the actual saved bytes.

Can Pillow preserve WebP transparency?

The transparent corner survived our separate lossless RGBA fixture. Converting the image to RGB beforehand would remove transparency.

Do these results apply to every photograph?

No. The fixture used six generated illustrations and small additional checks. Other material and production loads require separate evaluation.

Sources

  1. Pillow 13.0.0: Image file formats , Pillow
  2. Pillow 13.0.0: ImageOps , Pillow
  3. Byte Dossier Lab: sechs WebP-Titelbilder und sechs Funktionsprüfungen, ausgeführt am 13.11.2026
By

Byte Dossier Editorial Team

Editorial team

Byte Dossier publishes source-based analysis of AI search, GEO and web technology. Hands-on tests identify software versions, test setups and limitations. AI-generated illustrations are labelled. Commissioned provider lists disclose prescribed placements.