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.

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
- Pillow 13.0.0: Image file formats , Pillow
- Pillow 13.0.0: ImageOps , Pillow
- Byte Dossier Lab: sechs WebP-Titelbilder und sechs Funktionsprüfungen, ausgeführt am 13.11.2026