libtiff Validation
Port build from safelibs/port-libtiff at commit 44f63f1ed486 (release build-44f63f1ed486)
Tests
libtiff C API read write Original / libtiff / c-api-read-write Passed
Malformed TIFF rejection Original / libtiff / malformed-tiff-rejection Passed
tiffcp copy behavior Original / libtiff / tiffcp-copy Passed
tiffdump structure inspection Original / libtiff / tiffdump-structure Passed
tiffinfo metadata inspection Original / libtiff / tiffinfo-metadata Passed
Pillow add mirror TIFF Original / libtiff / usage-python3-pil-add-mirror-tiff Passed
Uses Pillow ImageChops.add on a generated TIFF and its mirrored copy and verifies the summed pixel values before round-tripping.
Pillow add_modulo mirror TIFF Original / libtiff / usage-python3-pil-add-modulo-mirror-tiff Passed
Uses Pillow ImageChops.add_modulo on a generated TIFF and its mirrored copy and verifies the modular per-channel sums before round-tripping.
python PIL autocontrast TIFF Original / libtiff / usage-python3-pil-autocontrast-tiff Passed
Pillow bilevel TIFF Original / libtiff / usage-python3-pil-bilevel-tiff Passed
Pillow bilinear resize TIFF Original / libtiff / usage-python3-pil-bilinear-resize-tiff Passed
Pillow blend mirror TIFF Original / libtiff / usage-python3-pil-blend-mirror-tiff Passed
Blends a generated TIFF with its mirrored copy in Pillow and verifies the blended pixel average before round-tripping.
Pillow blend alpha one TIFF Original / libtiff / usage-python3-pil-blend-one-mirror-tiff Passed
Uses Pillow Image.blend with alpha one on a generated TIFF and verifies the result equals the mirrored image pixel-for-pixel before round-tripping.
Pillow blend alpha zero TIFF Original / libtiff / usage-python3-pil-blend-zero-mirror-tiff Passed
Uses Pillow Image.blend with alpha zero on a generated TIFF and verifies the result equals the original image pixel-for-pixel before round-tripping.
python PIL border expand TIFF Original / libtiff / usage-python3-pil-border-expand-tiff Passed
Pillow opens TIFF from memory Original / libtiff / usage-python3-pil-bytesio-open-tiff Passed
Loads a TIFF from an in-memory byte buffer with Pillow and verifies the decoded image dimensions.
python PIL canvas paste TIFF Original / libtiff / usage-python3-pil-canvas-paste-tiff Passed
Pillow CMYK TIFF Original / libtiff / usage-python3-pil-cmyk-tiff Passed
Pillow composite halves TIFF Original / libtiff / usage-python3-pil-composite-halves-tiff Passed
Composites a generated TIFF with its mirrored copy through a half-image mask in Pillow and verifies left and right pixels come from different sources.
Pillow convert tiff Original / libtiff / usage-python3-pil-convert-tiff Passed
python PIL crop generated TIFF Original / libtiff / usage-python3-pil-crop-generated-tiff Passed
Pillow crop tiff Original / libtiff / usage-python3-pil-crop-tiff Passed
Pillow darker mirror TIFF Original / libtiff / usage-python3-pil-darker-mirror-tiff Passed
Uses Pillow ImageChops.darker on a generated TIFF and its mirrored copy and verifies the per-channel minima before round-tripping.
Pillow Deflate TIFF save Original / libtiff / usage-python3-pil-deflate-tiff Passed
Pillow difference mirror TIFF Original / libtiff / usage-python3-pil-difference-mirror-tiff Passed
Uses Pillow ImageChops.difference on a generated TIFF and its mirrored copy and verifies the absolute per-channel difference values before round-tripping.
Pillow duplicate darker TIFF Original / libtiff / usage-python3-pil-duplicate-darker-tiff Passed
Uses Pillow ImageChops.darker on a generated TIFF against its own copy and verifies every pixel matches the original before round-tripping.
python PIL equalize TIFF Original / libtiff / usage-python3-pil-equalize-tiff Passed
python PIL detail filter TIFF Original / libtiff / usage-python3-pil-filter-detail-tiff Passed
python PIL fit TIFF Original / libtiff / usage-python3-pil-fit-tiff Passed
Pillow flips TIFF vertically Original / libtiff / usage-python3-pil-flip-topbottom-tiff Passed
Pillow flip twice identity TIFF Original / libtiff / usage-python3-pil-flip-twice-identity-tiff Passed
Flips a generated TIFF twice with ImageOps.flip and verifies the result matches the original pixel-for-pixel before round-tripping.
Pillow floating point TIFF Original / libtiff / usage-python3-pil-float-tiff Passed
Pillow TIFF bounding box Original / libtiff / usage-python3-pil-getbbox-tiff Passed
Computes a bounding box for a TIFF with Pillow and verifies a valid four-value rectangle is returned.
python PIL getextrema TIFF Original / libtiff / usage-python3-pil-getextrema-tiff Passed
Pillow grayscale add TIFF Original / libtiff / usage-python3-pil-grayscale-add-tiff Passed
Converts a generated TIFF to L mode and adds its mirrored copy with ImageChops.add, verifying the saturated luminance sum before saving.
Pillow grayscale TIFF Original / libtiff / usage-python3-pil-grayscale-tiff Passed
python PIL histogram TIFF Original / libtiff / usage-python3-pil-histogram-tiff Passed
Pillow TIFF info dictionary Original / libtiff / usage-python3-pil-icc-info-tiff Passed
Pillow invert generated TIFF Original / libtiff / usage-python3-pil-invert-generated-tiff Passed
Uses Pillow ImageOps.invert on a generated TIFF and verifies the inverted channel values before round-tripping.
Pillow invert mirror lighter TIFF Original / libtiff / usage-python3-pil-invert-mirror-mirror-tiff Passed
Inverts a mirrored TIFF with ImageOps.invert and lighter-merges with the original, verifying the per-channel lighter pixel values before round-tripping.
python PIL invert point TIFF Original / libtiff / usage-python3-pil-invert-point-tiff Passed
python PIL L mode TIFF Original / libtiff / usage-python3-pil-l-mode-tiff Passed
Pillow LA mode TIFF Original / libtiff / usage-python3-pil-la-mode-tiff Passed
Saves an LA-mode TIFF with Pillow and verifies the reloaded image preserves the grayscale-plus-alpha mode.
Pillow lighter mirror TIFF Original / libtiff / usage-python3-pil-lighter-mirror-tiff Passed
Uses Pillow ImageChops.lighter on a generated TIFF and its mirrored copy and verifies the per-channel maxima before round-tripping.
Pillow lzw tiff Original / libtiff / usage-python3-pil-lzw-tiff Passed
Pillow mirrors TIFF left right Original / libtiff / usage-python3-pil-mirror-left-right-tiff Passed
Pillow mirror twice identity TIFF Original / libtiff / usage-python3-pil-mirror-twice-identity-tiff Passed
Mirrors a generated TIFF twice with ImageOps.mirror and verifies the result matches the original pixel-for-pixel before round-tripping.
Pillow multiframe TIFF count Original / libtiff / usage-python3-pil-multiframe-count-tiff Passed
Pillow TIFF frame seek Original / libtiff / usage-python3-pil-multiframe-seek-tiff Passed
Pillow multipage tiff Original / libtiff / usage-python3-pil-multipage-tiff Passed
Pillow multiply mirror TIFF Original / libtiff / usage-python3-pil-multiply-mirror-tiff Passed
Uses Pillow ImageChops.multiply on a generated TIFF and its mirrored copy and verifies the multiplied pixel values before round-tripping.
python PIL offset TIFF Original / libtiff / usage-python3-pil-offset-tiff Passed
Pillow open tiff Original / libtiff / usage-python3-pil-open-tiff Passed
Pillow PackBits TIFF Original / libtiff / usage-python3-pil-packbits-tiff Passed
python PIL pad TIFF Original / libtiff / usage-python3-pil-pad-tiff Passed
Pillow palette TIFF Original / libtiff / usage-python3-pil-palette-tiff Passed
Pillow pastes TIFF region Original / libtiff / usage-python3-pil-paste-region-tiff Passed
Pillow point shift TIFF Original / libtiff / usage-python3-pil-point-shift-tiff Passed
Applies a point-wise channel offset to a TIFF with Pillow and verifies the saved output remains decodable.
python PIL quantize TIFF Original / libtiff / usage-python3-pil-quantize-tiff Passed
BitsPerSample tag is a triple of 8s for an RGB Pillow TIFF Original / libtiff / usage-python3-pil-r10-tiff-bitspersample-rgb-triple Passed
Saves an RGB TIFF with Pillow and verifies tag_v2[258] BitsPerSample is exposed as a length-3 tuple where every entry equals 8, matching the three RGB samples per pixel.
Pillow TIFFs default to FillOrder MSB2LSB (1) Original / libtiff / usage-python3-pil-r10-tiff-fillorder-default-msb2lsb Passed
Saves a default RGB TIFF with Pillow and reads tag 266 back, asserting FillOrder defaults to 1 (MSB-to-LSB) when not explicitly set, matching the libtiff baseline.
pal2rgb expands a Pillow palette TIFF into RGB samples Original / libtiff / usage-python3-pil-r10-tiff-pal2rgb-palette-to-rgb Passed
Saves a P-mode TIFF with Pillow, runs pal2rgb to convert it to RGB, and verifies the result reopens with mode RGB, SamplesPerPixel=3, and PhotometricInterpretation=2 (RGB).
ppm2tiff converts a synthetic PPM into a Pillow-readable TIFF Original / libtiff / usage-python3-pil-r10-tiff-ppm2tiff-roundtrip Passed
Writes a small binary PPM, runs ppm2tiff to wrap it as TIFF, and verifies Pillow opens the result with mode RGB, the expected size, and pixel data matching the source PPM bytes.
tiff2pdf -j packs a Pillow JPEG-compressed TIFF into a PDF Original / libtiff / usage-python3-pil-r10-tiff-tiff2pdf-jpeg-output Passed
Saves a JPEG-compressed RGB TIFF with Pillow, runs tiff2pdf -j to wrap it as a PDF, and verifies the output begins with the %PDF-1 magic and ends with the %%EOF trailer.
tiff2ps emits a PostScript stream from a Pillow TIFF Original / libtiff / usage-python3-pil-r10-tiff-tiff2ps-postscript-magic Passed
Saves an RGB TIFF with Pillow, runs tiff2ps to convert it, and verifies the output begins with the %!PS-Adobe magic and contains a %%BoundingBox header.
tiff2rgba expands a Pillow palette TIFF into RGBA samples Original / libtiff / usage-python3-pil-r10-tiff-tiff2rgba-palette-to-rgba Passed
Saves a P-mode palette TIFF with Pillow, runs tiff2rgba to convert it, and verifies the result reopens as RGBA with SamplesPerPixel=4 and the original geometry preserved.
tiffcmp returns success on byte-equal Pillow TIFF copies Original / libtiff / usage-python3-pil-r10-tiff-tiffcmp-equal-files Passed
Saves an RGB TIFF with Pillow, copies it to a second file, and verifies tiffcmp exits 0 with no diff lines printed.
Pillow mode "1" bilevel TIFF passes through libtiff's tiffcp -c lzw Original / libtiff / usage-python3-pil-r10-tiff-tiffdither-bilevel-output Passed
Saves a Pillow mode "1" (1-bit) bilevel TIFF and round-trips it through libtiff's tiffcp -c lzw, then verifies the output is still a 1-bit, 32x16 TIFF with LZW compression via tiffinfo, exercising libtiff's bilevel reader and the LZW codec on Pillow-produced 1-bit imagery. (libtiff's tiffdither tool refuses Pillow output with "Not a b&w image" because Pillow's mode-L default save varies in SamplesPerPixel/PhotometricInterpretation — tiffcp on a true 1-bit source is the documented stable surface.)
tiffset rewrites Software tag on a Pillow TIFF Original / libtiff / usage-python3-pil-r10-tiff-tiffset-software-tag Passed
Saves an RGB TIFF with Pillow, uses tiffset -s 305 to overwrite the Software tag, and verifies Pillow reads the new value back from tag_v2[305].
PIL TIFF saved from mode "1" reports min-is-black photometric Original / libtiff / usage-python3-pil-r11-tiff-bilevel-mode-photometric Passed
Saves a Pillow mode='1' bilevel image to TIFF and verifies tiffinfo reports "Photometric Interpretation: min-is-black" (PhotometricInterpretation tag value 1) which is the libtiff convention for 1-bit bitmaps written from PIL.
PIL CMYK TIFF reports separated photometric and SamplesPerPixel 4 Original / libtiff / usage-python3-pil-r11-tiff-cmyk-photometric-separated Passed
Saves a Pillow CMYK image to TIFF and verifies tiffinfo reports "Photometric Interpretation: separated" and "Samples/Pixel: 4", reflecting the four ink channels of CMYK.
PIL bilevel TIFF saved with group4 reports CCITT Group 4 compression Original / libtiff / usage-python3-pil-r11-tiff-group4-fax-compression Passed
Saves a Pillow mode='1' bilevel image to TIFF with compression='group4' and verifies tag_v2[259] == 4 (CCITT Group 4) and tiffinfo reports "Compression Scheme: CCITT Group 4".
PIL I;16 grayscale TIFF reports BitsPerSample 16 Original / libtiff / usage-python3-pil-r11-tiff-i16-bits-per-sample-16 Passed
Saves a Pillow mode='I;16' grayscale TIFF and verifies tag_v2[258] BitsPerSample == 16 and tiffinfo reports "Bits/Sample: 16", reflecting the 16-bit unsigned integer sample format used by I;16 grayscale.
PIL TIFF saved with packbits sets Compression tag to 32773 Original / libtiff / usage-python3-pil-r11-tiff-packbits-compression-tag Passed
Saves an RGB TIFF with Pillow compression='packbits' and verifies tag_v2[259] == 32773 (PackBits) and tiffinfo reports "Compression Scheme: PackBits".
raw2tiff wraps an 8-bit grayscale buffer with declared geometry Original / libtiff / usage-python3-pil-r11-tiff-raw2tiff-grayscale-roundtrip Passed
Writes a deterministic 20x15 byte ramp to a raw file, runs raw2tiff with -w 20 -l 15 -b 1 -d byte, and verifies tiffinfo reports the exact ImageWidth/ImageLength and 8 bits-per-sample on the produced TIFF.
PIL RGBA TIFF tags ExtraSamples=2 (unassociated alpha) and Samples/Pixel=4 Original / libtiff / usage-python3-pil-r11-tiff-rgba-extra-samples-alpha Passed
Saves a Pillow RGBA TIFF and verifies tag_v2[277] SamplesPerPixel == 4 and tag_v2[338] ExtraSamples == (2,) (UNASSALPHA), confirming the alpha channel is recorded as unassociated alpha rather than premultiplied.
tiff2pdf produces a PDF whose page count matches the multi-page TIFF Original / libtiff / usage-python3-pil-r11-tiff-tiff2pdf-multipage-page-count Passed
Builds a 4-page TIFF with Pillow save_all + append_images, runs tiff2pdf, and verifies pdfinfo reports exactly Pages: 4 in the output PDF.
tiffset rewrites the Orientation tag and tiffinfo reports the new sense Original / libtiff / usage-python3-pil-r11-tiff-tiffset-orientation-tag Passed
Saves an RGB TIFF, runs tiffset -s 274 6 to set Orientation=6 (row 0 rhs, col 0 top), and verifies tiffinfo's "Orientation" line reports the new orientation token rather than the default.
tiffsplit with explicit prefix produces aaa/aab/aac single-image files Original / libtiff / usage-python3-pil-r11-tiff-tiffsplit-prefix-output-naming Passed
Builds a 3-page TIFF and runs tiffsplit with an explicit prefix; verifies the resulting files are named "<prefix>aaa.tif", "<prefix>aab.tif", "<prefix>aac.tif" (libtiff's deterministic alphabetic suffix sequence) and each contains exactly one TIFF directory.
PIL I;16 TIFF preserves a 40000 pixel value through libtiff write/read Original / libtiff / usage-python3-pil-r12-tiff-16bit-grayscale-pixel-roundtrip Passed
Saves an I;16 grayscale TIFF whose every pixel is 40000 and verifies the reopened image's mode is 'I;16' and getpixel((0,0)) returns 40000 unchanged, asserting libtiff stores 16-bit grayscale samples without truncation to 8 bits.
PIL TIFF saved with tiff_adobe_deflate sets Compression tag 8 and tiffinfo reports AdobeDeflate Original / libtiff / usage-python3-pil-r12-tiff-adobe-deflate-compression-tag-8 Passed
Saves an RGB TIFF with Pillow compression='tiff_adobe_deflate' and verifies tag_v2[259] == 8 (AdobeDeflate) and tiffinfo reports "Compression Scheme: AdobeDeflate", the modern z-streams TIFF codec id.
PIL TIFF saved with tiff_deflate sets Compression tag 32946 Original / libtiff / usage-python3-pil-r12-tiff-deflate-compression-tag-32946 Passed
Saves an RGB TIFF with Pillow compression='tiff_deflate' and verifies tag_v2[259] == 32946 (Deflate, original Adobe TIFF Technical Note 2 codec id), distinguishing it from the alternative tiff_adobe_deflate value 8.
PIL TIFF saved with tiff_lzw sets Compression tag 5 and tiffinfo reports LZW Original / libtiff / usage-python3-pil-r12-tiff-lzw-compression-tag-5 Passed
Saves an RGB TIFF with Pillow compression='tiff_lzw' and verifies tag_v2[259] == 5 (LZW) and tiffinfo reports "Compression Scheme: LZW", asserting the libtiff LZW codec path from Pillow.
PIL Image.n_frames reports 3 for a three-page TIFF Original / libtiff / usage-python3-pil-r12-tiff-multipage-n-frames-three Passed
Builds a 3-page TIFF using save_all and append_images and verifies Image.n_frames == 3 on reopen, reflecting the libtiff multi-directory layout discovered by Pillow.
PIL TIFF seek/tell cycle through frames matches the seeked index Original / libtiff / usage-python3-pil-r12-tiff-multipage-seek-tell-cycle Passed
Builds a 4-page TIFF with distinct solid colors and verifies Image.seek(i) followed by Image.tell() == i for i in 0..3, asserting the libtiff IFD walking is invoked correctly through Pillow.
PIL TIFF saved with compression='raw' sets Compression tag 1 (none) Original / libtiff / usage-python3-pil-r12-tiff-raw-uncompressed-compression-tag-1 Passed
Saves an RGB TIFF with Pillow compression='raw' and verifies tag_v2[259] == 1 (no compression), exercising the explicit no-compression Pillow alias.
PIL TIFF saved with dpi=(300,300) reports ResolutionUnit=2 (inch) Original / libtiff / usage-python3-pil-r12-tiff-resolution-unit-tag-2-inch Passed
Saves an RGB TIFF with Pillow dpi=(300,300) and verifies tag_v2[296] ResolutionUnit == 2 (inch) and tag_v2[282] XResolution and tag_v2[283] YResolution evaluate to 300, asserting the tag is set even when unit is the libtiff default.
PIL TIFF Software (305) and ImageDescription (270) round-trip via tiffinfo Original / libtiff / usage-python3-pil-r12-tiff-software-and-imagedescription-tags Passed
Saves a TIFF with explicit Software and ImageDescription string tags via Pillow's tiffinfo argument and verifies tiffinfo reports both lines verbatim and Pillow re-reads tag_v2[305] and tag_v2[270] with the same values.
tiffcp converts a Pillow stripped TIFF into a tiled TIFF with TileWidth/TileLength=64 Original / libtiff / usage-python3-pil-r12-tiff-tile-options-tagged Passed
Saves an RGB TIFF with Pillow (stripped layout) and runs libtiff's tiffcp -t -w 64 -l 64 to convert it into a tiled TIFF, then asserts tiffinfo reports "Tile Width: 64" and "Tile Length: 64" in the output metadata. (Pillow's TIFF writer does not honour a "tile" save kwarg; tiffcp is the libtiff-side surface for producing tiled imagery and is what this test exercises.)
PIL bilevel TIFF saved with group3 reports CCITT Group 3 in tiffinfo Original / libtiff / usage-python3-pil-r13-tiff-ccitt-fax-t4-bilevel Passed
Saves a Pillow mode='1' bilevel image with compression='group3' and verifies tiffinfo reports "Compression Scheme: CCITT Group 3" on the resulting file, asserting the libtiff Group 3 (T.4) fax codec round-trips through Pillow.
PIL F mode TIFF preserves a 0.5 float pixel through libtiff Original / libtiff / usage-python3-pil-r13-tiff-f-mode-float-zero-readback Passed
Builds a Pillow mode "F" image filled with 0.5, saves it as TIFF, and verifies the reopened mode is "F", size is unchanged, and getpixel((0,0)) is exactly 0.5 (representable as float32), asserting libtiff stores 32-bit IEEE float samples without quantisation.
PIL TIFF getexif() round-trips a DateTime ASCII (tag 306) through libtiff Original / libtiff / usage-python3-pil-r13-tiff-getexif-datetime-tag-306 Passed
Builds a Pillow Exif object with tag 306 = "2026:05:06 12:00:00", saves an RGB TIFF using exif=exif, and verifies on reopen that getexif()[306] decodes to the same string (after stripping any trailing NUL or bytes->str), asserting libtiff carries the EXIF DateTime ASCII through the Pillow round-trip.
PIL I;16 TIFF retains a 65000 pixel value on reload Original / libtiff / usage-python3-pil-r13-tiff-i16-pixel-65000-roundtrip Passed
Writes a Pillow I;16 grayscale TIFF whose every pixel is 65000 (near the 16-bit ceiling) and verifies the reopened image's mode is "I;16" and getpixel((4,2)) returns 65000 unchanged, asserting libtiff carries 16-bit grayscale samples without 8-bit truncation.
PIL TIFF description kwarg writes ImageDescription tag 270 readable on reopen Original / libtiff / usage-python3-pil-r13-tiff-imagedescription-via-description-kwarg Passed
Saves a Pillow TIFF with the description= keyword and verifies on reopen that tag_v2.get(270) (ImageDescription) returns the same ASCII string, asserting Pillow forwards the keyword into the libtiff IFD.
PIL TIFF saved with tiff_adobe_deflate reports info["compression"] as a deflate variant Original / libtiff / usage-python3-pil-r13-tiff-info-compression-string-deflate Passed
Saves an RGB TIFF with Pillow compression='tiff_adobe_deflate' and verifies image.info["compression"] is one of the documented deflate string ids ("tiff_adobe_deflate" or "tiff_deflate"), exercising the libtiff zip codec discovery path through the Pillow info dictionary rather than via the numeric Compression tag.
PIL TIFF saved with tiff_lzw exposes info["compression"] string "tiff_lzw" Original / libtiff / usage-python3-pil-r13-tiff-info-compression-string-lzw Passed
Saves an RGB TIFF with Pillow compression='tiff_lzw' and verifies that on reopen image.info["compression"] is the literal string "tiff_lzw" (PIL's string id, not the numeric tag), asserting the libtiff LZW codec is announced through the Pillow info dict.
PIL TIFF saved with compression='raw' reports info["compression"] == "raw" Original / libtiff / usage-python3-pil-r13-tiff-info-compression-string-raw Passed
Saves an RGB TIFF with Pillow compression='raw' (no compression) and verifies image.info["compression"] is exactly the string "raw", asserting Pillow propagates the "uncompressed" alias verbatim through the libtiff write path on reopen.
PIL TIFF dpi=(150,150) round-trips through image.info["dpi"] Original / libtiff / usage-python3-pil-r13-tiff-info-dpi-150-tuple Passed
Saves an RGB TIFF with dpi=(150,150) and verifies image.info["dpi"] on reopen evaluates to (150.0, 150.0) when each entry is cast to float, asserting Pillow's TIFF reader pulls XResolution/YResolution into the info dict consistent with the libtiff write of those rationals.
PIL TIFF save_all + append_images builds a 5-frame TIFF Original / libtiff / usage-python3-pil-r13-tiff-multipage-save-all-five-frames Passed
Saves five distinct solid-color RGB pages to a single TIFF using save_all=True with append_images of length four, then verifies Image.n_frames == 5 on reopen, asserting libtiff records all five IFDs and Pillow walks them.
PIL TIFF dpi=(72,72) round-trips through image.info["dpi"] Original / libtiff / usage-python3-pil-r14-tiff-dpi-72-tuple-roundtrip Passed
Saves an RGB TIFF with dpi=(72,72) and verifies image.info["dpi"] on reopen evaluates to (72.0, 72.0) when each entry is cast to float, asserting Pillow's TIFF reader pulls XResolution/YResolution into the info dict consistent with the libtiff write of those rationals at the screen-typical 72 dpi.
PIL TIFF getexif() round-trips Make (271) and Model (272) ASCII strings Original / libtiff / usage-python3-pil-r14-tiff-getexif-make-model-roundtrip Passed
Builds a Pillow Exif object with tag 271 (Make) = "ValidatorCo" and 272 (Model) = "ValidatorCam X1", saves an RGB TIFF using exif=exif, and verifies on reopen that getexif()[271] and getexif()[272] decode (after stripping any trailing NUL or bytes->str) to the same strings, asserting libtiff carries the Make/Model ASCII through the Pillow round-trip.
PIL TIFF tag_v2[257] (ImageLength) reads back the saved image height Original / libtiff / usage-python3-pil-r14-tiff-imagelength-tag-257-readback Passed
Saves a 19x43 RGB TIFF and verifies that tag_v2.get(257) (ImageLength) on reopen equals 43 (matching image.size[1]), asserting libtiff records the canonical ImageLength tag and Pillow surfaces it as an integer through the v2 IFD.
PIL TIFF tag_v2[256] (ImageWidth) reads back the saved image width Original / libtiff / usage-python3-pil-r14-tiff-imagewidth-tag-256-readback Passed
Saves a 37x21 RGB TIFF and verifies that tag_v2.get(256) (ImageWidth) on reopen equals 37 (matching image.size[0]), asserting libtiff records the canonical ImageWidth tag and Pillow surfaces it as an integer through the v2 IFD.
PIL bilevel TIFF saved with group3 exposes info["compression"] string "group3" Original / libtiff / usage-python3-pil-r14-tiff-info-compression-string-group3 Passed
Saves a mode "1" bilevel TIFF with Pillow compression='group3' and verifies image.info["compression"] equals "group3" (PIL's string id for the CCITT T.4 codec, numeric Compression tag value 3) on reopen, asserting libtiff's Group 3 fax codec is announced through the Pillow info dict.
PIL bilevel TIFF saved with group4 exposes info["compression"] string "group4" Original / libtiff / usage-python3-pil-r14-tiff-info-compression-string-group4 Passed
Saves a mode "1" bilevel TIFF with Pillow compression='group4' and verifies image.info["compression"] equals "group4" (PIL's string id for the CCITT T.6 codec, numeric Compression tag value 4) on reopen, asserting libtiff's Group 4 fax codec is announced through the Pillow info dict.
PIL TIFF saved with packbits exposes info["compression"] string "packbits" Original / libtiff / usage-python3-pil-r14-tiff-info-compression-string-packbits Passed
Saves an RGB TIFF with Pillow compression='packbits' and verifies that on reopen image.info["compression"] is exactly the literal string "packbits" (PIL's string id, not the numeric tag value 32773), asserting the libtiff PackBits codec is announced through the Pillow info dict.
PIL TIFF saved with jpeg compression exposes info["compression"] as a jpeg id Original / libtiff / usage-python3-pil-r14-tiff-info-compression-string-tiff-jpeg Passed
Saves an RGB TIFF with Pillow compression='jpeg' and verifies image.info["compression"] is one of the jpeg-family string ids ("jpeg" or "tiff_jpeg") on reopen, asserting libtiff's JPEG-in-TIFF codec is announced through the Pillow info dict rather than via the numeric Compression tag (7).
PIL TIFF mode "1" 1-bit bilevel image round-trips with BitsPerSample == 1 Original / libtiff / usage-python3-pil-r14-tiff-mode-1-1bit-bilevel-roundtrip Passed
Saves a mode "1" bilevel TIFF and verifies on reopen that the mode is still "1" (which PIL only assigns when libtiff's BitsPerSample is 1 and PhotometricInterpretation is 0/1). If tag_v2[258] is surfaced, also assert it equals 1; PIL on noble does not always populate this entry on read, so a missing value is tolerated as long as the mode round-trips.
PIL TIFF mode "RGBA" round-trips and exposes a 4th alpha band on reopen Original / libtiff / usage-python3-pil-r14-tiff-mode-rgba-alpha-channel-roundtrip Passed
Saves a mode "RGBA" TIFF with a non-trivial alpha channel and verifies on reopen that mode == "RGBA", split() produces 4 bands, and the alpha band's getextrema() returns the expected (min,max) tuple, asserting libtiff round-trips the alpha sample through Pillow.
PIL TIFF getexif() round-trips ImageDescription ASCII (tag 270) through libtiff Original / libtiff / usage-python3-pil-r15-tiff-getexif-imagedescription-tag-270 Passed
Builds a Pillow Exif object with tag 270 (ImageDescription) = "validator r15 description", saves an RGB TIFF using exif=ex, and verifies on reopen that getexif()[270] decodes to the same string after stripping trailing NUL bytes, asserting libtiff carries the ImageDescription ASCII through Pillow's getexif() round-trip.
PIL TIFF getexif() round-trips a Software ASCII (tag 305) through libtiff Original / libtiff / usage-python3-pil-r15-tiff-getexif-software-tag-305 Passed
Builds a Pillow Exif object with tag 305 = "ValidatorR15Software", saves an RGB TIFF using exif=ex, and verifies on reopen that getexif()[305] decodes to the same string after stripping any trailing NUL byte (or bytes->str), asserting libtiff carries the Software ASCII through Pillow's getexif() round-trip.
PIL TIFF dpi=(300,300) round-trips through image.info["dpi"] Original / libtiff / usage-python3-pil-r15-tiff-info-dpi-300-tuple Passed
Saves an RGB TIFF with dpi=(300,300) and verifies that on reopen the image.info["dpi"] tuple, when each entry is cast to float, equals (300.0, 300.0), asserting Pillow surfaces the libtiff XResolution/YResolution rationals at print-typical 300 dpi.
PIL TIFF dpi=(200,100) preserves asymmetric X/Y resolution on round-trip Original / libtiff / usage-python3-pil-r15-tiff-info-dpi-asymmetric-200x100 Passed
Saves an RGB TIFF with an asymmetric dpi=(200,100) (XResolution != YResolution), then verifies on reopen that image.info["dpi"] cast to floats equals (200.0, 100.0), asserting libtiff retains the X and Y resolution rationals independently rather than collapsing them to a single value.
PIL mode "F" TIFF retains a fractional 0.5 pixel value on reload Original / libtiff / usage-python3-pil-r15-tiff-mode-f-float-half-pixel-roundtrip Passed
Writes a Pillow mode "F" (float32) TIFF whose every pixel is 0.5 and verifies the reopened image's mode is "F" and getpixel((1,1)) is exactly 0.5 (well-represented in IEEE-754 float32), asserting libtiff carries float32 sample values through Pillow's mode "F" round-trip without rounding to integer.
PIL mode "I" (int32) TIFF retains a 100000 pixel value on reload Original / libtiff / usage-python3-pil-r15-tiff-mode-i-int32-pixel-roundtrip Passed
Writes a Pillow mode "I" (int32 signed) TIFF whose every pixel is 100000 (well outside the 16-bit range) and verifies the reopened image's mode begins with "I" and getpixel((2,2)) returns 100000 unchanged, asserting libtiff carries 32-bit integer samples without truncating to 16 or 8 bits.
PIL I;16 TIFF reports the expected extrema for a flat 32000 image Original / libtiff / usage-python3-pil-r15-tiff-mode-i16-extrema-roundtrip Passed
Writes a Pillow I;16 grayscale TIFF whose every pixel is 32000 and verifies the reopened image's mode is "I;16" and getextrema() returns (32000, 32000), asserting libtiff carries 16-bit grayscale samples and Pillow surfaces both extrema accurately for a uniform image.
PIL mode "L" TIFF carries a 200 pixel value through getpixel after reopen Original / libtiff / usage-python3-pil-r15-tiff-mode-l-getpixel-200-roundtrip Passed
Writes a Pillow mode "L" TIFF whose every pixel is 200 (mid-bright 8-bit grayscale) and verifies the reopened image's mode is "L", size is preserved, and getpixel((3,1)) returns 200 unchanged, asserting libtiff round-trips 8-bit grayscale samples without value distortion.
PIL TIFF save_all + seek(2) reaches the third page with its expected color Original / libtiff / usage-python3-pil-r15-tiff-multipage-seek-frame-2-pixel Passed
Saves three distinct solid-color RGB pages (red, green, blue) to a single TIFF using save_all=True with append_images of length two, then verifies on reopen that n_frames == 3, im.seek(2) succeeds, and getpixel((0, 0)) of the third frame returns (0, 0, 255), asserting libtiff records all three IFDs and Pillow can navigate to the third frame and recover its pixel data.
PIL RGBA TIFF returns the exact corner pixel via getpixel after reopen Original / libtiff / usage-python3-pil-r15-tiff-rgba-getpixel-corner-roundtrip Passed
Writes a Pillow mode "RGBA" TIFF filled with (12, 34, 56, 78) and verifies on reopen that mode == "RGBA" and getpixel((0, 0)) returns the same 4-tuple unchanged, asserting libtiff carries all four 8-bit RGBA samples without channel reordering or alpha drop.
PIL TIFF DateTime tag 306 written via tiffinfo dict survives a save+reopen Original / libtiff / usage-python3-pil-r16-tiff-datetime-tag-306-roundtrip Passed
Saves a small RGB TIFF with tag_v2 DateTime 306 supplied via the tiffinfo kwarg, reopens the file with Pillow, and asserts tag_v2[306] equals the original ASCII timestamp, exercising libtiff's ASCII DateTime tag write/read.
PIL TIFF save without save_all writes a single-frame file even after a prior multi-frame save Original / libtiff / usage-python3-pil-r16-tiff-default-append-false-overwrites Passed
Writes a 3-frame multi-page TIFF with save_all=True, then re-saves to the same path with a single image and the default save_all=False, reopens with Pillow, asserts n_frames is 1, mode is L, and the only frame's (0,0) pixel matches the single-image value — exercising Pillow's default non-append save behaviour atop libtiff.
PIL I;16 TIFF preserves mode I;16 and 10x7 dimensions across save and reopen Original / libtiff / usage-python3-pil-r16-tiff-i16-roundtrip-size-and-mode Passed
Saves a 10x7 I;16 image with constant value 12345 as a TIFF, reopens with Pillow, asserts the reopened mode is exactly "I;16", asserts the reopened size is (10, 7), and asserts every sampled pixel along the diagonal equals the original constant.
PIL TIFF ImageDescription tag 270 written via description kwarg roundtrips through tag_v2 Original / libtiff / usage-python3-pil-r16-tiff-imagedescription-tag-270-roundtrip Passed
Saves a small RGB TIFF with a fixed description=... kwarg, reopens the file with Pillow, and asserts tag_v2[270] equals the original description string, exercising libtiff's ImageDescription tag write/read path through Pillow.
PIL RGB TIFF surfaces ImageWidth (256) and ImageLength (257) tags matching saved dimensions Original / libtiff / usage-python3-pil-r16-tiff-imagewidth-imagelength-rgb Passed
Saves a 19x13 RGB TIFF with Pillow, reopens with Pillow, asserts tag_v2[256] equals 19 and tag_v2[257] equals 13, and asserts info or the image size matches the same dimensions — exercising libtiff's width/length tags through Pillow's reader.
PIL RGB TIFF saved with tiff_lzw compression roundtrips pixel data exactly Original / libtiff / usage-python3-pil-r16-tiff-lzw-rgb-roundtrip Passed
Builds a 16x16 RGB image with a deterministic gradient, saves it as TIFF with compression='tiff_lzw', reopens with Pillow, asserts the reopened image is RGB sized 16x16, and asserts a sampled corner pixel matches the original byte-for-byte.
PIL save_all append_images writes a 3-frame TIFF readable via seek Original / libtiff / usage-python3-pil-r16-tiff-multiimage-append-three-frames Passed
Saves a TIFF with save_all=True and append_images=[f2, f3], reopens with Pillow, asserts n_frames is 3, seeks to frames 0, 1, and 2 and asserts each frame's mode is L and the per-frame fill colour matches the originals via getpixel((0,0)).
PIL L-mode TIFF saved with packbits compression preserves dimensions and pixels Original / libtiff / usage-python3-pil-r16-tiff-packbits-grayscale-roundtrip Passed
Creates a 12x12 grayscale (L) image with a deterministic ramp, saves as TIFF with compression='packbits', reopens with Pillow, asserts mode L and size 12x12, asserts the pixel at (0,0) and (11,11) match the original values, and asserts info['compression'] is one of the accepted packbits identifiers (string 'packbits' or int 32773).
PIL RGB TIFF reports PhotometricInterpretation tag 262 equal to 2 (RGB) Original / libtiff / usage-python3-pil-r16-tiff-photometric-rgb-equals-2 Passed
Saves a small RGB image as an uncompressed TIFF, reopens with Pillow, asserts tag_v2[262] (PhotometricInterpretation) equals integer 2 — the libtiff identifier for RGB — and asserts the image mode is RGB.
Pillow stripped TIFF re-tiled to 64x64 reports matching tile geometry via tiffinfo Original / libtiff / usage-python3-pil-r16-tiff-tile-geometry-via-tiffinfo Passed
Writes a 128x96 RGB stripped TIFF with Pillow, runs libtiff's tiffcp -t -w 64 -l 64 to produce a tiled variant, and asserts tiffinfo reports both "Tile Width: 64" and "Tile Length: 64", relying on tiffinfo as the authoritative source for tile geometry instead of PIL tag_v2.
Pillow TIFF Artist tag 315 round-trips via tag_v2 Original / libtiff / usage-python3-pil-r17-tiff-artist-tag-roundtrip Passed
Writes a TIFF with the Artist tag (315) set to a fixed string via the tiffinfo kwarg, reopens with Pillow, and asserts tag_v2[315] equals the original string byte-for-byte, confirming libtiff's ASCII tag round-trip via Pillow.
Pillow TIFF Copyright tag 33432 round-trips via tag_v2 Original / libtiff / usage-python3-pil-r17-tiff-copyright-tag-roundtrip Passed
Writes a TIFF with the Copyright tag (33432) set to a fixed string via the tiffinfo kwarg, reopens with Pillow, and asserts tag_v2[33432] equals the original string byte-for-byte, confirming libtiff's ASCII Copyright tag round-trip.
Pillow TIFF ImageWidth (256) and ImageLength (257) tags match the image size on read Original / libtiff / usage-python3-pil-r17-tiff-imagewidth-imagelength-tags Passed
Saves a 17x13 RGB TIFF with Pillow, reopens it, and asserts tag_v2[256] equals 17 and tag_v2[257] equals 13, confirming libtiff round-trips ImageWidth/ImageLength tags consistent with Pillow's reported size.
Pillow grayscale ("L") TIFF round-trips dimensions and mode Original / libtiff / usage-python3-pil-r17-tiff-l-mode-roundtrip-size Passed
Writes an 11x7 grayscale "L" mode TIFF with Pillow, reopens it, asserts the mode is exactly "L" and the size tuple equals (11, 7), confirming libtiff's MinIsBlack grayscale single-sample round-trip via Pillow.
Pillow palette ("P") TIFF round-trips and preserves the P mode on reopen Original / libtiff / usage-python3-pil-r17-tiff-mode-p-palette-roundtrip Passed
Constructs an 8x8 "P" mode palette image, saves it as a TIFF, reopens it with Pillow, and asserts the reopened image mode is exactly "P" with the same width and height, confirming libtiff palette pass-through and Pillow's TIFF palette decoding.
Pillow single-page TIFF reports n_frames == 1 Original / libtiff / usage-python3-pil-r17-tiff-n-frames-single-page Passed
Writes a single-page RGB TIFF, reopens it with Pillow, and asserts the n_frames property equals 1, confirming libtiff's single-directory IFD chain is reported as one frame by Pillow.
Pillow TIFF ResolutionUnit tag 296 is a numeric value in {1,2,3} Original / libtiff / usage-python3-pil-r17-tiff-resolution-unit-tag-integer Passed
Writes an RGB TIFF with default resolution settings, reopens it, asserts tag_v2[296] (ResolutionUnit) is an integer (or castable to one) whose value is in the libtiff-defined set {1=None, 2=Inch, 3=Centimeter}, confirming the tag round-trips as a numeric enum.
Pillow RGBA TIFF preserves a distinct alpha value at the (0,0) corner across round-trip Original / libtiff / usage-python3-pil-r17-tiff-rgba-alpha-corner-roundtrip Passed
Writes a 4x4 RGBA TIFF with the corner pixel (0,0) set to RGBA (10,20,30,40) and the rest opaque white, reopens with Pillow, asserts the reopened mode is "RGBA" and getpixel((0,0)) returns the same (10,20,30,40) tuple, confirming libtiff alpha-plane preservation.
Pillow RGB TIFF reports RowsPerStrip tag 278 as a positive integer Original / libtiff / usage-python3-pil-r17-tiff-rowsperstrip-tag-positive Passed
Saves a 32x32 RGB TIFF, reopens it with Pillow, asserts tag_v2[278] (RowsPerStrip) is castable to a positive integer no greater than the image height (32), confirming libtiff records strip geometry consistent with image dimensions.
Pillow RGB TIFF reports SamplesPerPixel tag 277 equal to 3 Original / libtiff / usage-python3-pil-r17-tiff-samples-per-pixel-rgb-equals-three Passed
Saves a small RGB TIFF with Pillow, reopens it, asserts tag_v2[277] (SamplesPerPixel) equals integer 3 and that the image mode is "RGB", confirming libtiff records three samples per pixel for the RGB photometric interpretation.
Pillow TIFF with compression="tiff_adobe_deflate" round-trips pixel-equal to the original Original / libtiff / usage-python3-pil-r18-tiff-adobe-deflate-compression-roundtrip Passed
Saves a small RGB pattern as a TIFF using compression="tiff_adobe_deflate", reopens it with Pillow, asserts the reopened mode/size match the source, and asserts the decoded bytes are byte-for-byte equal to the original tobytes() result, confirming libtiff Adobe-flavored deflate compression is lossless.
Pillow RGB TIFF reports BitsPerSample tag 258 as three 8-bit values Original / libtiff / usage-python3-pil-r18-tiff-bits-per-sample-rgb-equals-8 Passed
Saves a small RGB TIFF, reopens it with Pillow, asserts tag_v2[258] (BitsPerSample) is an iterable yielding exactly three values each equal to 8, confirming libtiff records 8-bit-per-channel sample depth for the standard RGB photometric.
Pillow TIFF DateTime tag 306 round-trips a fixed timestamp string Original / libtiff / usage-python3-pil-r18-tiff-datetime-tag-roundtrip Passed
Writes an RGB TIFF with the DateTime tag (306) set to the canonical libtiff "YYYY:MM:DD HH:MM:SS" timestamp via tiffinfo, reopens with Pillow, and asserts tag_v2[306] equals the original 19-character timestamp string byte-for-byte.
Pillow getexif() on a TIFF returns an Exif mapping that contains the Software tag Original / libtiff / usage-python3-pil-r18-tiff-getexif-returns-exif-mapping Passed
Writes a TIFF with the Software tag (305) populated via tiffinfo, reopens it with Pillow, calls im.getexif() and asserts the returned object is an instance of PIL.Image.Exif whose mapping contains tag 305 equal to the original string, confirming libtiff EXIF-compatible tag exposure through Pillow's Exif API.
Pillow TIFF im.info dict carries a compression key reflecting save compression Original / libtiff / usage-python3-pil-r18-tiff-info-dict-has-compression-key Passed
Saves an RGB TIFF with compression="tiff_lzw", reopens it with Pillow, asserts im.info is a dict, asserts it contains a "compression" key, and asserts the recorded value equals "tiff_lzw", confirming libtiff-backed compression metadata is exposed through Pillow's per-image info dictionary.
Pillow TIFF save_all with two appended frames produces a 3-page n_frames Original / libtiff / usage-python3-pil-r18-tiff-multiframe-append-three-pages Passed
Writes a multipage TIFF by calling Image.save with save_all=True and an append_images list of two additional frames, reopens the resulting file with Pillow, and asserts im.n_frames equals exactly 3, confirming libtiff multi-page IFD chaining round-trips through Pillow's append API.
Pillow RGB TIFF reports PhotometricInterpretation tag 262 as 2 (RGB) Original / libtiff / usage-python3-pil-r18-tiff-photometric-rgb-equals-2 Passed
Saves an RGB TIFF, reopens it with Pillow, asserts tag_v2[262] (PhotometricInterpretation) is castable to integer 2, which is libtiff's PHOTOMETRIC_RGB constant, confirming the photometric tag is encoded correctly for a standard RGB pixel layout.
Pillow seeks between TIFF frames keeping the same mode and size across pages Original / libtiff / usage-python3-pil-r18-tiff-seek-between-frames-mode-stable Passed
Builds a two-page TIFF where both frames are RGB and 5x5, calls im.seek(0) then im.seek(1) on the reopened file, and asserts both frames report the same mode "RGB" and the same size (5, 5), confirming libtiff IFD navigation preserves per-page metadata reported by Pillow.
Pillow TIFF Software tag 305 round-trips through tag_v2 unchanged Original / libtiff / usage-python3-pil-r18-tiff-software-tag-roundtrip Passed
Writes an RGB TIFF with the Software tag (305) set to a fixed ASCII identifier via a TiffImagePlugin.ImageFileDirectory_v2, reopens with Pillow, and asserts tag_v2[305] equals the original string byte-for-byte, confirming libtiff persists the Software ASCII tag through a save-and-reload cycle.
Pillow TIFF XResolution tag 282 reports a positive rational equivalent to the saved DPI Original / libtiff / usage-python3-pil-r18-tiff-xresolution-tag-rational Passed
Saves a TIFF with dpi=(150, 150), reopens it with Pillow, asserts tag_v2[282] (XResolution) is a libtiff rational castable to a positive float equal to 150.0, and asserts tag_v2[283] (YResolution) is also castable to 150.0, confirming libtiff RATIONAL-typed tag round-trip via Pillow.
Pillow TIFF getexif exposes XResolution tag 282 with a float-castable rational Original / libtiff / usage-python3-pil-r19-tiff-getexif-xresolution-tag-282 Passed
Saves a TIFF with dpi=(200, 200), reopens with Pillow, calls im.getexif() to obtain an Exif object, asserts 282 (XResolution) is a key in the mapping with a value castable to float equal to 200.0, asserts 283 (YResolution) is also present and equals 200.0, and asserts 296 (ResolutionUnit) is in the mapping with integer value 2 (inches), confirming libtiff IFD0 resolution tags surface via getexif.
Pillow TIFF multi-page tell() returns to 0 after seeking back from a later frame Original / libtiff / usage-python3-pil-r19-tiff-multiframe-tell-resets-after-seek-zero Passed
Saves a 4-page TIFF where each page has a distinct fill color, opens the file with Pillow, asserts initial im.tell() is 0, seeks to frame 2 and asserts im.tell() returns 2, then seeks to frame 0 and asserts im.tell() returns 0 again, also asserts the reloaded pixel at (0,0) on frame 0 matches the original red color, confirming libtiff random-access page navigation.
Pillow TIFF NewSubfileType tag 254 absent or zero for a standalone single-image save Original / libtiff / usage-python3-pil-r19-tiff-newsubfiletype-tag-254-zero Passed
Saves a single-image RGB TIFF, reopens with Pillow, and asserts the optional NewSubfileType tag 254 either is missing from tag_v2 or evaluates to integer 0 (no reduced-resolution, page, or mask flags set), confirming libtiff omits or clears the subfile classification on a plain primary image.
Pillow TIFF Orientation tag 274 defaults to 1 (top-left) for a plain RGB save Original / libtiff / usage-python3-pil-r19-tiff-orientation-tag-274-default-topleft Passed
Saves a 4x4 RGB TIFF with no explicit orientation, reopens with Pillow, and asserts tag_v2[274] equals 1 (Orientation TopLeft, the libtiff default) or is absent (interpreted as 1 by the TIFF 6.0 spec); if absent the test additionally asserts im.getexif().get(274, 1) equals 1, confirming the canonical default orientation behavior.
Pillow TIFF saved from L-mode reports PhotometricInterpretation 1 (MinIsBlack) Original / libtiff / usage-python3-pil-r19-tiff-photometric-grayscale-equals-1 Passed
Creates an L-mode (8-bit grayscale) Pillow image filled with value 100, saves as TIFF, reopens and asserts tag_v2[262] (PhotometricInterpretation) equals 1 (MinIsBlack) and asserts tag_v2[258] (BitsPerSample) equals 8 (or the single-element tuple (8,)), confirming libtiff records grayscale photometric metadata correctly.
Pillow TIFF PlanarConfiguration tag 284 defaults to 1 (chunky/interleaved) for an RGB save Original / libtiff / usage-python3-pil-r19-tiff-planarconfig-tag-284-chunky Passed
Saves an RGB TIFF with no explicit planar configuration override, reopens with Pillow, asserts tag_v2[284] equals 1 (chunky, samples interleaved per pixel) which is libtiff's default for RGB, and asserts tag_v2[277] (SamplesPerPixel) equals 3, confirming libtiff writes an interleaved layout for plain RGB data.
Pillow TIFF StripByteCounts tag 279 enumerates positive values for an RGB save Original / libtiff / usage-python3-pil-r19-tiff-stripoffsets-tag-279-list Passed
Saves a 16x16 RGB TIFF, reopens with Pillow, asserts tag_v2[279] (StripByteCounts) is a non-empty tuple of positive integers, asserts sum(tag_v2[279]) is >= width*height*samples (3*16*16=768) which is the uncompressed payload floor, and asserts tag_v2[273] (StripOffsets) has the same number of entries as StripByteCounts, confirming libtiff strip-layout tags are populated and consistent.
libtiff tiffcp -r 2 produces an output TIFF whose RowsPerStrip tag equals 2 Original / libtiff / usage-python3-pil-r19-tiff-tiffcp-strip-rowsperstrip-2 Passed
Generates a 16x16 RGB source TIFF via Pillow, invokes "tiffcp -r 2" to repackage it with two rows per strip, opens the output with Pillow, asserts tag_v2[278] (RowsPerStrip) equals 2, and asserts tag_v2[279] (StripByteCounts) is a tuple of 8 entries (16 rows / 2 rows per strip), confirming libtiff's strip-layout control via the tiffcp CLI.
Pillow TIFF tobytes equals width*height*samples for an RGB save-then-load cycle Original / libtiff / usage-python3-pil-r19-tiff-tobytes-roundtrip-byte-count Passed
Saves a 6x4 RGB TIFF with deterministic pixel data, reopens it, calls im.tobytes() on the reloaded image, asserts its length equals 6*4*3 = 72 bytes (no row padding for raw RGB tobytes), and asserts the reloaded tobytes is identical to the original image's tobytes byte-for-byte, confirming libtiff RGB pixel-data preservation.
Pillow TIFF YResolution tag 283 round-trips an asymmetric dpi value Original / libtiff / usage-python3-pil-r19-tiff-yresolution-tag-rational Passed
Saves an RGB TIFF with dpi=(96, 144) (asymmetric x/y resolution), reopens with Pillow, asserts tag_v2[282] (XResolution) is castable to 96.0 and tag_v2[283] (YResolution) is castable to 144.0, and asserts the two values differ, confirming libtiff persists independent rational X/Y resolution tags through a write+read cycle.
Pillow CMYK TIFF reports four bands and SamplesPerPixel 4 Original / libtiff / usage-python3-pil-r20-tiff-cmyk-mode-four-bands-spp-4 Passed
Saves a 3x3 mode-CMYK TIFF, reopens with Pillow, asserts im.getbands() returns the tuple ('C', 'M', 'Y', 'K'), and asserts the SamplesPerPixel tag 277 reads as 4, confirming libtiff writes four-channel CMYK images with correct band metadata.
Pillow crop on a TIFF reload shrinks dimensions to the requested rect Original / libtiff / usage-python3-pil-r20-tiff-crop-region-changes-size Passed
Saves a 10x10 RGB TIFF via Pillow, reopens, calls .crop((2, 3, 7, 9)), asserts the cropped image has size (5, 6) (width=7-2, height=9-3), and asserts crop().getpixel((0, 0)) equals the parent's getpixel((2, 3)), confirming libtiff-decoded pixel data correctly anchors a PIL crop region.
Pillow-written TIFF file size exceeds the raw pixel byte count Original / libtiff / usage-python3-pil-r20-tiff-filesize-positive-and-nonzero Passed
Saves a 16x16 mode-L TIFF via Pillow and asserts os.path.getsize of the resulting file is strictly greater than 16*16 (the raw pixel byte count) and less than 16384 (an extremely generous upper bound), confirming libtiff encodes recognisable container overhead (header + IFD + tags) around the strip payload.
Pillow TIFF RGB image preserves a non-corner pixel through save and reload Original / libtiff / usage-python3-pil-r20-tiff-getpixel-center-rgb-roundtrip Passed
Builds a 7x7 mode-RGB image filled with black, sets pixel (3, 3) to (171, 82, 199), saves as TIFF, reopens, and asserts r.getpixel((3, 3)) equals (171, 82, 199) exactly, confirming libtiff round-trips a single interior RGB triple losslessly.
Pillow can decode a TIFF directly from an in-memory BytesIO buffer Original / libtiff / usage-python3-pil-r20-tiff-load-from-bytesio-preserves-size Passed
Saves a 6x5 mode-RGB image into a BytesIO via Image.save(buf, format='TIFF'), seeks the buffer to 0, opens it with Image.open(buf), loads, and asserts the resulting size is exactly (6, 5) and mode is 'RGB', confirming libtiff's stream-based decode path handles a non-filesystem reader.
Pillow thumbnail on a TIFF-loaded image fits within the requested bounds Original / libtiff / usage-python3-pil-r20-tiff-thumbnail-fits-within-bounding-box Passed
Saves a 40x20 RGB TIFF, reopens, calls .thumbnail((10, 10)) (modifies in place), and asserts the resulting image's width <= 10 and height <= 10 and that the aspect ratio is preserved (width > height since source aspect 40:20 should produce width:height >= 2:1 after shrink), confirming libtiff-decoded pixels feed Pillow's aspect-preserving thumbnail correctly.
tiffinfo CLI on a Pillow-written TIFF prints Image Width and Image Length lines Original / libtiff / usage-python3-pil-r20-tiff-tiffinfo-prints-image-width-and-length Passed
Saves a 9x7 RGB TIFF via Pillow, runs the tiffinfo CLI on it, and asserts the output contains a line matching "Image Width: 9" and a line matching "Image Length: 7", confirming the libtiff inspection tool reads back the dimensions Pillow wrote.
Pillow TIFF image tobytes length equals width*height for L-mode Original / libtiff / usage-python3-pil-r20-tiff-tobytes-getdata-equal-length Passed
Saves and reopens a 5x6 mode-L TIFF, calls .tobytes() and asserts the length equals 5*6 (30), and calls list(im.getdata()) and asserts its length is also 30, confirming libtiff decodes the strip data back to a contiguous one-byte-per-pixel buffer for grayscale.
Pillow Image.transpose FLIP_LEFT_RIGHT on a TIFF reload mirrors a specific column Original / libtiff / usage-python3-pil-r20-tiff-transpose-flip-left-right-mirrors-pixel Passed
Saves a 6x3 mode-L TIFF, places a unique value at column 0 row 0, reopens, calls .transpose(Image.FLIP_LEFT_RIGHT), and asserts the resulting image getpixel((5, 0)) equals the source's column-0 row-0 value (mirror moves column 0 to column 5 in width=6), confirming libtiff-decoded pixels feed the PIL transpose correctly.
Pillow Image.verify on a freshly-saved TIFF completes without raising Original / libtiff / usage-python3-pil-r20-tiff-verify-on-valid-file-does-not-raise Passed
Saves a 5x5 RGB TIFF via Pillow, opens it again with Image.open, calls .verify() within a try/except block, and asserts no exception was raised, confirming Pillow's libtiff-backed verifier accepts a well-formed TIFF container as valid.
Pillow Image.copy on an opened TIFF preserves size, mode, and pixel value Original / libtiff / usage-python3-pil-r21-tiff-copy-preserves-size-and-mode Passed
Saves a 6x6 mode-L TIFF filled with 77, opens it, calls .copy() and asserts the returned image has identical size, mode, and getpixel((0,0)) value as the original, validating libtiff decode plus Pillow's image clone path.
Pillow getexif on a saved TIFF exposes YResolution at tag id 283 Original / libtiff / usage-python3-pil-r21-tiff-getexif-yresolution-tag-283 Passed
Saves a 5x5 RGB TIFF with dpi=(72, 144), reopens it, calls im.getexif() and asserts tag 283 (YResolution) is present and its rational/numeric value equals 144.0, validating libtiff resolution-tag emission via Pillow's EXIF mapping.
Pillow Image.is_animated is True for a saved 3-page TIFF Original / libtiff / usage-python3-pil-r21-tiff-is-animated-multipage-true Passed
Saves three solid frames as a multipage TIFF using save_all=True, opens it via Image.open, and asserts both Image.n_frames equals 3 and Image.is_animated is True for the multi-page libtiff stream.
Pillow Image.is_animated is False for a single-page TIFF Original / libtiff / usage-python3-pil-r21-tiff-is-animated-single-page-false Passed
Saves a single solid frame as a TIFF (no save_all), opens it via Image.open, and asserts n_frames equals 1 and is_animated is False, confirming the libtiff single-IFD path is correctly reported as non-animated by Pillow.
Pillow load() on a TIFF clears the tile list so a subsequent load() is a no-op Original / libtiff / usage-python3-pil-r21-tiff-load-end-frees-tile-state Passed
Saves a 4x4 mode-L TIFF, opens it, asserts that im.tile is non-empty before load(), then calls load() and asserts im.tile is now empty (decode complete), confirming libtiff strip/tile decode state is consumed exactly once by Pillow.
Pillow mode 1 TIFF default FillOrder tag (266) defaults to MSB2LSB (value 1) Original / libtiff / usage-python3-pil-r21-tiff-mode-1-fillorder-default-tag Passed
Saves an 8x8 mode-1 TIFF (bilevel), opens it via Image.open, and asserts the FillOrder tag (266) is present in tag_v2 and equals 1 (MSB2LSB), validating libtiff's bilevel default fill-order encoding.
Pillow I;16 mode TIFF getextrema returns (min, max) tuple over 16-bit pixel range Original / libtiff / usage-python3-pil-r21-tiff-mode-i16-getextrema-tuple Passed
Constructs an I;16 image from raw little-endian bytes containing the four values 0, 1, 30000, and 65535, saves it as TIFF, reopens, and asserts getextrema() returns exactly (0, 65535), exercising libtiff 16-bit grayscale decoding plus Pillow's per-mode min/max computation.
Pillow TIFF seek past the last frame raises EOFError Original / libtiff / usage-python3-pil-r21-tiff-multipage-seek-past-end-raises Passed
Saves a 2-frame TIFF, opens it, seeks to frame 1, then attempts to seek to frame 2 and asserts an EOFError is raised, validating Pillow's libtiff multipage boundary handling.
Pillow TIFF save round-trip preserves ImageDescription via explicit save kwarg Original / libtiff / usage-python3-pil-r21-tiff-save-with-exif-bytes-roundtrip Passed
Saves a 3x3 RGB TIFF with an explicit description="r21-roundtrip" kwarg, reopens it, and asserts tag 270 (ImageDescription) on tag_v2 equals the supplied string, exercising libtiff string-tag write+read.
Pillow TiffImagePlugin tag_v2 mapping contains BitsPerSample (tag 258) Original / libtiff / usage-python3-pil-r21-tiff-tag-v2-contains-bitspersample Passed
Saves a 7x7 RGB TIFF, opens it, and asserts that 258 (BitsPerSample) is present in im.tag_v2 with a tuple value of three eights, validating libtiff's tag-2-name dictionary surface for the RGB photometric path.
Pillow 1-bit bilevel TIFF roundtrip Original / libtiff / usage-python3-pil-r9-tiff-1bit-bilevel Passed
Saves a Pillow mode 1 (bilevel) image as TIFF and verifies the reopened TIFF reports mode 1 with the expected pixel pattern.
Pillow CMYK TIFF roundtrip Original / libtiff / usage-python3-pil-r9-tiff-cmyk-mode Passed
Creates a CMYK image with Pillow, saves it as TIFF, reopens it, and verifies the pixel mode is CMYK with 4 channels.
Pillow L-mode 8-bit grayscale TIFF roundtrip Original / libtiff / usage-python3-pil-r9-tiff-l-mode-roundtrip Passed
Saves an 8-bit grayscale TIFF via Pillow and verifies all pixel values survive the roundtrip exactly.
Pillow multi-page TIFF n_frames matches save count Original / libtiff / usage-python3-pil-r9-tiff-multipage-frame-count Passed
Saves a 5-frame multi-page TIFF via Pillow append_images and verifies n_frames reports 5 on reopen.
Pillow TIFF resolution tag roundtrip Original / libtiff / usage-python3-pil-r9-tiff-resolution-tag Passed
Saves a TIFF with a 300 dpi resolution tuple via Pillow and verifies the reopened image carries the same resolution metadata.
Pillow RGBA TIFF roundtrip preserves alpha Original / libtiff / usage-python3-pil-r9-tiff-rgba-roundtrip Passed
Saves an RGBA TIFF with a known alpha channel and verifies the reopened TIFF returns the original alpha values pixel-for-pixel.
Pillow rotate 90 TIFF dimensions swap Original / libtiff / usage-python3-pil-r9-tiff-rotate-90-roundtrip Passed
Saves a 12x4 TIFF via Pillow, rotates the reopened image by 90 degrees with expand=True, saves the rotated TIFF, and verifies the dimensions swap to 4x12.
Pillow thumbnail shrinks TIFF below cap Original / libtiff / usage-python3-pil-r9-tiff-thumbnail-shrink Passed
Loads a 80x60 TIFF and applies thumbnail((20, 20)) and verifies both reported dimensions are at most 20.
tiffinfo parses a hand-rolled big-endian TIFF Original / libtiff / usage-python3-pil-r9-tiff-tiffinfo-bigendian Passed
Builds a big-endian TIFF via raw struct serialization and verifies tiffinfo can parse it and report the expected ImageWidth/ImageLength dimensions.
tiffinfo reports Rows/Strip on Pillow output Original / libtiff / usage-python3-pil-r9-tiff-tiffinfo-strip-count Passed
Generates a TIFF via Pillow and verifies tiffinfo prints a Rows/Strip directory entry that matches the image height.
python PIL red channel TIFF Original / libtiff / usage-python3-pil-red-channel-tiff Passed
Pillow nearest resize TIFF Original / libtiff / usage-python3-pil-resize-nearest-tiff Passed
Resizes a TIFF with nearest-neighbor sampling in Pillow and verifies the requested output dimensions.
Pillow resizes TIFF Original / libtiff / usage-python3-pil-resize-tiff Passed
Pillow RGB tiff load Original / libtiff / usage-python3-pil-rgb-tiff-load Passed
Pillow RGBA TIFF Original / libtiff / usage-python3-pil-rgba-tiff Passed
python PIL rotate 180 TIFF Original / libtiff / usage-python3-pil-rotate-180-tiff Passed
Pillow rotates TIFF 270 degrees Original / libtiff / usage-python3-pil-rotate-270-tiff Passed
python PIL rotate expand TIFF Original / libtiff / usage-python3-pil-rotate-expand-tiff Passed
Pillow rotates TIFF Original / libtiff / usage-python3-pil-rotate-tiff Passed
Pillow saves TIFF to memory Original / libtiff / usage-python3-pil-save-memory-tiff Passed
Saves a TIFF into an in-memory buffer with Pillow, reloads it, and verifies the buffered image stays decodable.
Pillow screen mirror TIFF Original / libtiff / usage-python3-pil-screen-mirror-tiff Passed
Uses Pillow ImageChops.screen on a generated TIFF and its mirrored copy and verifies the screened pixel values before round-tripping.
python PIL sequence iterator TIFF Original / libtiff / usage-python3-pil-sequence-iterator-tiff Passed
Pillow splits TIFF bands Original / libtiff / usage-python3-pil-split-bands-tiff Passed
python PIL split merge TIFF Original / libtiff / usage-python3-pil-split-merge-bands-tiff Passed
Pillow split and merge TIFF Original / libtiff / usage-python3-pil-split-merge-tiff Passed
Splits a TIFF into bands with Pillow, merges the bands again, and verifies the result stays decodable.
python PIL stat mean TIFF Original / libtiff / usage-python3-pil-stat-mean-tiff Passed
Pillow subtract mirror TIFF Original / libtiff / usage-python3-pil-subtract-mirror-tiff Passed
Uses Pillow ImageChops.subtract on mirrored and original generated TIFFs and verifies the non-negative channel differences before round-tripping.
Pillow subtract_modulo mirror TIFF Original / libtiff / usage-python3-pil-subtract-modulo-mirror-tiff Passed
Uses Pillow ImageChops.subtract_modulo on a generated TIFF and its mirrored copy and verifies the modular per-channel differences before round-tripping.
Pillow tags tiff Original / libtiff / usage-python3-pil-tags-tiff Passed
Pillow thumbnail tiff Original / libtiff / usage-python3-pil-thumbnail-tiff Passed
Pillow TIFF 16-bit grayscale point doubled Original / libtiff / usage-python3-pil-tiff-16bit-grayscale-point-doubled Passed
Loads an "I;16" TIFF, applies an Image.point lambda x: x*2 mapped through "I" mode to avoid 16-bit overflow, saves the result, and verifies pixels are exactly doubled (capped by I mode width).
Pillow TIFF 16-bit grayscale round-trip Original / libtiff / usage-python3-pil-tiff-16bit-grayscale-roundtrip Passed
Writes an "I;16" 16-bit grayscale TIFF and verifies BitsPerSample=16, SampleFormat, and that pixel bytes round-trip via sha256.
Pillow TIFF 16-bit pixel Original / libtiff / usage-python3-pil-tiff-16bit-pixel-batch11 Passed
Pillow TIFF 72 dpi preserved Original / libtiff / usage-python3-pil-tiff-72dpi-preserved Passed
Saves a TIFF with dpi=(72,72) and verifies that XResolution, YResolution, and the info dpi tuple round-trip correctly.
Pillow TIFF Artist and HostComputer tag round-trip Original / libtiff / usage-python3-pil-tiff-artist-hostcomputer-tags Passed
Saves a TIFF with Artist (315) and HostComputer (316) tags injected via ImageFileDirectory_v2 and verifies both strings reload exactly through Pillow tag_v2 on reopen.
Pillow TIFF endianness magic detection Original / libtiff / usage-python3-pil-tiff-bigtiff-magic-detection Passed
Writes a TIFF with Pillow (little-endian) and a hand-crafted minimal big-endian TIFF, then verifies the II*/MM* magic bytes and that Pillow can detect format on the LE file.
Pillow TIFF bigtiff=True save kwarg accepted and pixel round-trip preserved Original / libtiff / usage-python3-pil-tiff-bigtiff-pillow-kwarg-roundtrip Passed
Saves an RGB TIFF with the Pillow bigtiff=True kwarg, verifies the file begins with one of the legal TIFF magic byte sequences (classic II/MM or BigTIFF II\\x2b/MM\\x2b — Pillow 10.2 may emit either), and asserts the reopened image preserves geometry, mode, and exact pixel bytes against the in-memory original.
Pillow TIFF tiffcp -8 BigTIFF little-endian magic + multipage preserved Original / libtiff / usage-python3-pil-tiff-bigtiff-write-libtiff Passed
Writes a two-page classic little-endian TIFF with Pillow, repackages it as a BigTIFF (-8) via tiffcp without changing byte order, and verifies the II\x00\x2b magic (BigTIFF little-endian), that tiffinfo enumerates two directories with the expected geometries, and that tiffcp -L round-trips the BigTIFF back to a classic TIFF whose pixel buffers match the Pillow originals.
Pillow TIFF BytesIO open Original / libtiff / usage-python3-pil-tiff-bytesio-open-batch11 Passed
Pillow TIFF tiff_ccitt CCITT modified Huffman RLE compression on 1-bit image Original / libtiff / usage-python3-pil-tiff-ccitt-rle-bilevel-compression Passed
Saves a 1-bit (mode "1") bilevel TIFF with compression="tiff_ccitt" (CCITT modified Huffman run-length encoding, Compression tag value 2) and verifies the reopened TIFF reports info["compression"]=="tiff_ccitt", Compression tag (259) equals 2, the mode stays "1", BitsPerSample (258) equals 1, and the bilevel pixel pattern survives the round-trip exactly.
Pillow TIFF Copyright tag round-trip Original / libtiff / usage-python3-pil-tiff-copyright-tag-roundtrip Passed
Saves a TIFF with a Copyright tag (33432) injected via ImageFileDirectory_v2 and verifies the string round-trips through libtiff on reload.
Pillow TIFF DateTime tag round-trip Original / libtiff / usage-python3-pil-tiff-datetime-tag-roundtrip Passed
Saves a TIFF with a DateTime tag (306) in the canonical "YYYY:MM:DD HH:MM:SS" format and verifies the value reads back unchanged via tag_v2.
Pillow TIFF deflate info tag Original / libtiff / usage-python3-pil-tiff-deflate-info-tag Passed
Saves a TIFF with compression=tiff_deflate and verifies the reopened info compression and Compression tag value.
Pillow TIFF description tag Original / libtiff / usage-python3-pil-tiff-description-tag-batch11 Passed
Pillow TIFF DPI info Original / libtiff / usage-python3-pil-tiff-dpi-info-batch11 Passed
Pillow TIFF DPI save Original / libtiff / usage-python3-pil-tiff-dpi-save Passed
Pillow TIFF ImageOps.exif_transpose orientation 6 Original / libtiff / usage-python3-pil-tiff-exif-transpose-orientation Passed
Saves a TIFF with Orientation=6 (rotate 270 CW) tag injected via ImageFileDirectory_v2 and verifies via tiffdump that the tag is encoded into the file, plus that ImageOps.exif_transpose returns a properly-oriented image with the expected dimensions.
Pillow TIFF expand border Original / libtiff / usage-python3-pil-tiff-expand-border-batch11 Passed
Pillow TIFF explicit XResolution rational tag via tiffinfo dict Original / libtiff / usage-python3-pil-tiff-explicit-xresolution-rational Passed
Saves a TIFF with XResolution (282) and YResolution (283) injected as IFDRational(150/1) and (300/1) through a low-level ImageFileDirectory_v2, then verifies tiffinfo prints the resolutions and Pillow exposes the exact rational values.
Pillow TIFF F mode float32 deterministic pixel round-trip Original / libtiff / usage-python3-pil-tiff-f-mode-float32-pixel-roundtrip Passed
Builds an F mode image with deterministic float values, saves it as TIFF, and verifies that BitsPerSample is 32, SampleFormat (339) is IEEE FP (3), and per-pixel float values reload identically via Image.getpixel.
Pillow TIFF bands Original / libtiff / usage-python3-pil-tiff-getbands-batch11 Passed
Pillow TIFF getexif() exposes DateTime tag (306) saved via exif kwarg Original / libtiff / usage-python3-pil-tiff-getexif-datetime-roundtrip Passed
Builds a Pillow Exif object, sets DateTime (306) to a known string, saves an RGB TIFF with exif=exif, reopens the file, and verifies that getexif() returns the DateTime back exactly and that the tag also appears in the top-level tag_v2 dictionary, confirming the EXIF round-trip path works through libtiff.
Pillow TIFF group3 bilevel compression Original / libtiff / usage-python3-pil-tiff-group3-bilevel-compression Passed
Writes a 1-bit TIFF compressed with CCITT Group 3 and verifies the Compression tag is 3 and bilevel pixels round-trip exactly.
Pillow TIFF group4 bilevel compression Original / libtiff / usage-python3-pil-tiff-group4-bilevel-compression Passed
Writes a 1-bit TIFF compressed with CCITT Group 4 and verifies the Compression tag and pixel round-trip.
Pillow TIFF I (int32) mode round-trip with SampleFormat=2 and BitsPerSample=32 Original / libtiff / usage-python3-pil-tiff-i-mode-int32-roundtrip Passed
Saves a Pillow "I" (32-bit signed integer) image to a temporary TIFF and verifies the reopened image preserves the mode, BitsPerSample tag (258) equals 32, SampleFormat tag (339) equals 2 (signed integer), pixel size is preserved, and the raw int32 putpixel value round-trips through getpixel.
Pillow TIFF I;16 little-endian BitsPerSample tag Original / libtiff / usage-python3-pil-tiff-i16-le-bitspersample-tag Passed
Saves an I;16 little-endian grayscale TIFF and verifies BitsPerSample (258) is 16, SamplesPerPixel (277) is 1, and the raw 16-bit pixel buffer round-trips byte-exact through Pillow tobytes.
Pillow TIFF I;16B big-endian round-trip Original / libtiff / usage-python3-pil-tiff-i16b-bigendian-roundtrip Passed
Builds an "I;16B" big-endian 16-bit grayscale image, saves it through libtiff, and verifies the pixels round-trip with BitsPerSample=16 and SamplesPerPixel=1.
Pillow TIFF embedded ICC profile (tag 34675) roundtrip Original / libtiff / usage-python3-pil-tiff-icc-profile-embedded Passed
Writes a TIFF with Pillow embedding a synthetic ICC profile blob via icc_profile, then verifies tiffinfo lists "ICC Profile" and Pillow re-exposes the exact bytes via info["icc_profile"] and tag 34675.
Pillow TIFF image description tag Original / libtiff / usage-python3-pil-tiff-image-description-tag Passed
Saves a TIFF with a custom ImageDescription (tag 270) injected via tiffinfo and verifies the string round-trips on reload.
Pillow TIFF invert L mode Original / libtiff / usage-python3-pil-tiff-invert-l-mode-batch11 Passed
Pillow TIFF JPEG compression info Original / libtiff / usage-python3-pil-tiff-jpeg-compression-info Passed
Writes a JPEG-compressed RGB TIFF and verifies the Compression tag, info dict, and reopened image dimensions.
Pillow TIFF JPEG quality parameter Original / libtiff / usage-python3-pil-tiff-jpeg-quality-save Passed
Writes a JPEG-compressed TIFF with Pillow using the quality parameter and verifies the Compression tag is 7, the file is non-empty, and the reopened image preserves dimensions and mode.
Pillow TIFF LA mode samples round-trip Original / libtiff / usage-python3-pil-tiff-la-mode-samples-roundtrip Passed
Saves a Pillow LA (luminance + alpha) image as TIFF and verifies SamplesPerPixel=2, BitsPerSample=(8,8), and pixel byte round-trip.
Pillow TIFF LZW with predictor round-trip Original / libtiff / usage-python3-pil-tiff-lzw-predictor-roundtrip Passed
Writes an LZW-compressed TIFF with horizontal differencing predictor (317=2) and verifies sha256 byte round-trip plus the Compression tag.
Pillow TIFF Make and Model tag round-trip Original / libtiff / usage-python3-pil-tiff-make-model-tags-roundtrip Passed
Saves a TIFF with Make (271) and Model (272) injected via ImageFileDirectory_v2 tiffinfo and verifies tiffinfo prints both fields and Pillow tag_v2 returns the exact strings on reload.
Pillow TIFF MinSampleValue (280) and MaxSampleValue (281) tags round-trip Original / libtiff / usage-python3-pil-tiff-min-max-sample-value-tags Passed
Saves an L-mode TIFF with explicit MinSampleValue (tag 280) and MaxSampleValue (tag 281) values forwarded through tiffinfo and verifies the reopened image returns both tags - tolerating either scalar or 1-tuple shapes per Pillow tag_v2 conventions - while preserving the pixel mode, BitsPerSample (258) of 8, and image dimensions, demonstrating Pillow forwards SHORT-typed sample-range hints into libtiff and reads them back without coercion.
Pillow TIFF multipage mixed compression via tiffcp Original / libtiff / usage-python3-pil-tiff-multipage-mixed-compression Passed
Writes two single-page RGB TIFFs with Pillow, applies tiffcp -c lzw to page A and tiffcp -c zip to page B, then concatenates them with tiffcp to form a single 2-page TIFF and verifies each frame's Compression tag (259) on reload (5=LZW, 8=Adobe Deflate).
Pillow TIFF multipage save with three differently sized RGB pages Original / libtiff / usage-python3-pil-tiff-multipage-mixed-sizes Passed
Saves a three-page TIFF where each page has a distinct (width, height) and a distinct fill color via save_all+append_images, then walks the frames with seek() and asserts that n_frames is 3, each frame's size matches its expected dimensions in order, each frame stays in mode RGB, and the upper-left pixel of each page returns the expected fill color, demonstrating Pillow propagates per-IFD geometry through libtiff.
Pillow TIFF multi-page seek and tell walk Original / libtiff / usage-python3-pil-tiff-multipage-seek-tell-walk Passed
Writes a 5-page TIFF with distinct flat colors per page and walks frames with seek/tell, checking that each frame's index and dominant color match its position in the sequence.
Pillow TIFF multipage seek third Original / libtiff / usage-python3-pil-tiff-multipage-seek-third-batch11 Passed
Pillow TIFF tiffset Orientation tag value 3 round-trip Original / libtiff / usage-python3-pil-tiff-orientation-tag-bottomright Passed
Saves a TIFF with Pillow, sets the Orientation tag (274) to 3 (rotated 180 / bottom-right) via libtiff's tiffset CLI, and verifies tiffinfo reports "row 0 bottom, col 0 rhs" while Pillow reloads the same RGB pixel buffer (Pillow does not auto-transpose on load).
Pillow TIFF PageName and DocumentName tag round-trip Original / libtiff / usage-python3-pil-tiff-page-name-document-name-tags Passed
Saves a TIFF with DocumentName (269) and PageName (285) injected via ImageFileDirectory_v2 and verifies both strings round-trip through libtiff and reload exactly via Pillow tag_v2.
Pillow TIFF PageNumber tag (297) round-trips a (page, total) pair Original / libtiff / usage-python3-pil-tiff-pagenumber-tag-roundtrip Passed
Writes a single-page TIFF with an explicit PageNumber tag (297) of (0, 1) via tiffinfo and verifies the reopened image returns a length-2 tuple whose first entry is 0 and second is 1, demonstrating Pillow forwards the SHORT[2] tag to libtiff and reads it back without coercion.
Pillow TIFF palette mode emits ColorMap tag (320) of 768 entries Original / libtiff / usage-python3-pil-tiff-palette-colormap-tag Passed
Saves a P-mode TIFF with a ramp palette and verifies the reopened TIFF carries PhotometricInterpretation (262) equal to 3 (palette), a ColorMap tag (320) with exactly 768 16-bit entries (3 channels x 256 colors), BitsPerSample (258) equal to 8, and that the indexed pixel maps back to the expected palette RGB triple.
Pillow TIFF photometric minisblack Original / libtiff / usage-python3-pil-tiff-photometric-minisblack-l Passed
Writes a grayscale TIFF and verifies the PhotometricInterpretation tag equals 1 (minisblack) on reload.
Pillow TIFF photometric miniswhite via tiffcp Original / libtiff / usage-python3-pil-tiff-photometric-miniswhite-bilevel Passed
Builds a 1-bit TIFF with Pillow, converts photometric to MinIsWhite (0) using tiffset, then verifies the PhotometricInterpretation tag (262) reads as 0 on reload via Pillow tag_v2.
Pillow TIFF photometric separated CMYK Original / libtiff / usage-python3-pil-tiff-photometric-separated-cmyk Passed
Writes a CMYK TIFF and verifies PhotometricInterpretation equals 5 (separated) and SamplesPerPixel equals 4.
Pillow TIFF planar configuration via tiffcp Original / libtiff / usage-python3-pil-tiff-planar-configuration-save Passed
Writes an RGB TIFF with Pillow then converts it to planar configuration with tiffcp and verifies the PlanarConfiguration tag and dimensions on reload.
Pillow TIFF predictor deflate round-trip Original / libtiff / usage-python3-pil-tiff-predictor-deflate-roundtrip Passed
Writes a deflate-compressed TIFF with horizontal differencing predictor and verifies sha256 byte round-trip.
Pillow TIFF resolution exact rationals Original / libtiff / usage-python3-pil-tiff-resolution-rationals-exact Passed
Saves a TIFF with dpi=(72,144) and verifies tiffinfo reports XResolution/YResolution lines and PIL exposes the exact rational values via tag_v2.
Pillow TIFF resolution unit centimeter Original / libtiff / usage-python3-pil-tiff-resolution-unit-centimeter Passed
Saves a TIFF with explicit ResolutionUnit=3 (centimeter) via tiffinfo and verifies the tag round-trips.
Pillow TIFF resolution unit inch Original / libtiff / usage-python3-pil-tiff-resolution-unit-inch Passed
Saves a TIFF with dpi=(150,150) and verifies the ResolutionUnit tag (296) is 2 (inch) and XResolution/YResolution round-trip.
Pillow TIFF ResolutionUnit (296) saved as 1 (no absolute unit) Original / libtiff / usage-python3-pil-tiff-resolution-unit-none Passed
Saves a TIFF with explicit ResolutionUnit=1 (no absolute unit, so the X/YResolution rationals describe an aspect ratio only) via tiffinfo and verifies the tag round-trips as 1 while the rationals XResolution (282) and YResolution (283) preserve their ratio after reload.
Pillow TIFF strip byte counts sanity for raw RGB Original / libtiff / usage-python3-pil-tiff-rgb-strip-byte-counts-positive Passed
Saves a 32x16 RGB TIFF with raw (uncompressed) compression and verifies that StripByteCounts (279) sums to width*height*3 = 1536, matching the raw payload size for an 8-bit-per-sample chunky 24-bit TIFF.
Pillow TIFF RGBA ExtraSamples tag (338) marks the alpha channel Original / libtiff / usage-python3-pil-tiff-rgba-extrasamples-tag Passed
Saves a Pillow RGBA TIFF and verifies that on reload SamplesPerPixel (277) equals 4, ExtraSamples (338) is present and contains exactly one entry equal to 2 (unassociated alpha), PhotometricInterpretation (262) equals 2 (RGB), and the constant alpha pixel round-trips byte-for-byte.
Pillow TIFF explicit RowsPerStrip via tiffcp -r repackage Original / libtiff / usage-python3-pil-tiff-rowsperstrip-explicit Passed
Writes a TIFF with Pillow (Pillow does not support multistrip output via the tiffinfo dict; that path raises NotImplementedError), repackages it through tiffcp -r 8 to force RowsPerStrip = 8, and verifies the saved RowsPerStrip tag (278) matches on reload.
Pillow TIFF RowsPerStrip = 16 via tiffcp -r 16 repackage Original / libtiff / usage-python3-pil-tiff-rowsperstrip-tag-tiffcp-r-16 Passed
Writes a 40x80 single-strip TIFF with Pillow (Pillow itself raises NotImplementedError when asked to emit multistrip output, so the layout is forced via tiffcp -r 16 instead) then verifies the repackaged file has Rows/Strip=16, exactly five strips, and Pillow reads back the RowsPerStrip tag (278) as 16.
Pillow TIFF sequence sum Original / libtiff / usage-python3-pil-tiff-sequence-sum-batch11 Passed
Pillow TIFF Software tag round-trip Original / libtiff / usage-python3-pil-tiff-software-tag-roundtrip Passed
Saves a TIFF with a custom Software tag (305) injected via ImageFileDirectory_v2 and verifies the string survives a save/reload cycle through libtiff.
Pillow TIFF strip byte counts via tiffinfo Original / libtiff / usage-python3-pil-tiff-strip-byte-counts-tiffinfo-s Passed
Saves a stripped TIFF with Pillow and verifies the tiffinfo report exposes the per-strip table (rows-per-strip, strip count, and a [offset, byte-count] entry) and that the PIL tag_v2 exposes consistent strip counts.
Pillow TIFF SubIFD tag (330) roundtrip via low-level tag dict Original / libtiff / usage-python3-pil-tiff-subifd-tag-roundtrip Passed
Writes a TIFF whose IFD carries a SubIFD pointer (tag 330) injected through a low-level ImageFileDirectory_v2, then reopens with Pillow and verifies tag 330 is preserved verbatim alongside the standard image tags.
Pillow TIFF three-page save_all Original / libtiff / usage-python3-pil-tiff-three-page-savall Passed
Writes a three-page TIFF with save_all and append_images, then verifies n_frames and per-frame size.
Pillow TIFF tiff2bw grayscale conversion Original / libtiff / usage-python3-pil-tiff-tiff2bw-grayscale Passed
Writes an RGB TIFF with Pillow, converts it to grayscale with tiff2bw, and verifies SamplesPerPixel=1, PhotometricInterpretation=1 and PIL mode L on reload.
Pillow TIFF tiff2bw -R red-only weight Original / libtiff / usage-python3-pil-tiff-tiff2bw-red-only Passed
Writes an RGB TIFF with Pillow whose pixels have a known red channel, runs tiff2bw with -R 100 -G 0 -B 0 (red-only weighting; tiff2bw treats -R/-G/-B as percentages, so 100/0/0 means 100% red contribution), and verifies the resulting grayscale pixel values match the original red channel and PhotometricInterpretation is 1.
Pillow TIFF tiff2pdf -p A4 paper size Original / libtiff / usage-python3-pil-tiff-tiff2pdf-a4-paper Passed
Writes a TIFF with Pillow, converts it to PDF with tiff2pdf -p A4 to set the page size, and verifies the output starts with %PDF- and is non-empty.
Pillow TIFF to PDF via tiff2pdf Original / libtiff / usage-python3-pil-tiff-tiff2pdf-conversion Passed
Writes a TIFF with Pillow, converts it to PDF with tiff2pdf, and verifies the output starts with the %PDF- magic and is a non-empty file.
Pillow TIFF tiffcp big-endian output Original / libtiff / usage-python3-pil-tiff-tiffcp-bigendian-output Passed
Writes a little-endian TIFF with Pillow, runs tiffcp -B to convert it to big-endian byte order, and verifies the MM*.. magic and that Pillow can still decode the resulting file with matching dimensions and mode.
Pillow TIFF tiffcp -8 -B BigTIFF big-endian Original / libtiff / usage-python3-pil-tiff-tiffcp-bigtiff-bigendian Passed
Writes a classic little-endian TIFF with Pillow, repackages it as a BigTIFF (-8) in big-endian byte order (-B) via tiffcp, and verifies the MM..\x2b magic (BigTIFF big-endian) plus that tiffinfo reports the correct geometry. Pillow 10.2.0 on Ubuntu 24.04 cannot decode BigTIFF reliably, so the readback is performed with tiffinfo + libtiff itself rather than Pillow.
Pillow TIFF tiffcp -c none uncompressed Original / libtiff / usage-python3-pil-tiff-tiffcp-c-none-uncompressed Passed
Writes a Deflate-compressed TIFF with Pillow, then converts it with tiffcp -c none and verifies the Compression tag (259) becomes 1 (no compression) and pixel data round-trips byte-for-byte.
Pillow TIFF tiffcp -c packbits Original / libtiff / usage-python3-pil-tiff-tiffcp-c-packbits Passed
Writes an uncompressed TIFF with Pillow, converts it with tiffcp -c packbits, and verifies the Compression tag (259) becomes 32773 (PackBits) and pixel data is preserved.
Pillow TIFF tiffcp -c zip deflate alias Original / libtiff / usage-python3-pil-tiff-tiffcp-c-zip-deflate Passed
Writes an uncompressed TIFF with Pillow, converts it with tiffcp -c zip (the deflate alias), and verifies the Compression tag (259) is 8 (Deflate/Adobe Deflate) and pixels are preserved.
Pillow TIFF tiffcp -c jpeg with rows-per-strip Original / libtiff / usage-python3-pil-tiff-tiffcp-jpeg-rows-per-strip Passed
Writes a stripped TIFF with Pillow, converts it to JPEG-compressed TIFF with tiffcp -c jpeg -r 16, and verifies Compression=7 and RowsPerStrip=16 on reload.
Pillow TIFF tiffcp -c lzw conversion Original / libtiff / usage-python3-pil-tiff-tiffcp-lzw-roundtrip Passed
Writes an uncompressed TIFF with Pillow, converts it to LZW with tiffcp -c lzw, and verifies the Compression tag (259) is 5 and pixel data is preserved.
Pillow TIFF tiffcp -r 32 mid-size strip layout Original / libtiff / usage-python3-pil-tiff-tiffcp-r-32-mid-strip Passed
Writes a 40x100 TIFF with Pillow (single strip), repackages with tiffcp -r 32 to produce four strips (32+32+32+4 rows), and verifies RowsPerStrip = 32 and exactly four strips on the output via tiffinfo -s plus Pillow tag readback.
Pillow TIFF tiffcp 32x32 tile conversion Original / libtiff / usage-python3-pil-tiff-tiffcp-tile-32x32-convert Passed
Writes a stripped TIFF with Pillow then converts it to a 32x32-tiled TIFF with tiffcp -t -w 32 -l 32 and verifies tile geometry via PIL tag_v2 and tiffinfo.
Pillow TIFF strip to tile via tiffcp Original / libtiff / usage-python3-pil-tiff-tiffcp-tile-convert Passed
Writes a stripped TIFF with Pillow then converts it to a tiled TIFF with tiffcp and verifies TileWidth/TileLength via Pillow.
Pillow TIFF tiffcrop -E t top-edge crop Original / libtiff / usage-python3-pil-tiff-tiffcrop-e-top-edge Passed
Writes a 40x100 RGB TIFF with Pillow, runs tiffcrop -E t -m 0,0,80,0 -U px to crop 80 rows off the bottom (origin = top edge), and verifies the cropped output is 40x20 with matching ImageWidth/ImageLength tags via Pillow.
Pillow TIFF tiffcrop -i with two single-page inputs Original / libtiff / usage-python3-pil-tiff-tiffcrop-i-concat-two-inputs Passed
Writes two single-page Pillow TIFFs of identical geometry, runs tiffcrop -i (ignore read errors) with both as sources to produce a single multi-frame output, and verifies the destination opens as a 2-frame TIFF whose per-page solid colors round-trip via Pillow seek().
Pillow TIFF tiffcrop rotate 90 Original / libtiff / usage-python3-pil-tiff-tiffcrop-rotate-90 Passed
Writes a TIFF with Pillow then runs tiffcrop -R 90 and verifies the rotated dimensions and PIL mode on reload.
Pillow TIFF tiffdump key tag inspection Original / libtiff / usage-python3-pil-tiff-tiffdump-key-tags Passed
Writes an RGB TIFF with Pillow, runs tiffdump on it, and asserts the low-level dump reports the expected key directory tags (ImageWidth, ImageLength, BitsPerSample, Photometric, SamplesPerPixel) with the values we wrote.
Pillow TIFF tiffinfo BitsPerSample for 16-bit grayscale Original / libtiff / usage-python3-pil-tiff-tiffinfo-bps-16bit-gray Passed
Writes a 16-bit grayscale (I;16) TIFF with Pillow, runs tiffinfo, and verifies the Bits/Sample line reports 16 and the Photometric Interpretation is the min-is-black grayscale flavour. (tiffinfo only emits a Samples/Pixel line when SamplesPerPixel > 1, so we use Photometric Interpretation as the single-band sanity check instead.)
Pillow TIFF tiffinfo CLI inspect Original / libtiff / usage-python3-pil-tiff-tiffinfo-cli-inspect Passed
Writes a TIFF with Pillow then runs the tiffinfo CLI and verifies key tag lines (ImageWidth, ImageLength, BitsPerSample) appear in the report.
Pillow TIFF tiffinfo -j JPEG tables on JPEG-compressed TIFF Original / libtiff / usage-python3-pil-tiff-tiffinfo-j-jpeg-tables Passed
Writes a JPEG-compressed RGB TIFF with Pillow (compression="jpeg"), runs tiffinfo -j to dump the JPEGTables (tag 347) header, and verifies the report mentions Compression Scheme: JPEG and a non-zero JPEG Tables byte count, and that Pillow exposes Compression=7 plus a non-empty JPEGTables tag.
Pillow TIFF tiffinfo Photometric Interpretation line Original / libtiff / usage-python3-pil-tiff-tiffinfo-photometric-line Passed
Writes an RGB TIFF with Pillow then runs the tiffinfo CLI and verifies the Photometric Interpretation line is reported with the RGB color descriptor.
Pillow TIFF tiffmedian palette reduction Original / libtiff / usage-python3-pil-tiff-tiffmedian-palette-reduce Passed
Writes an RGB TIFF with Pillow, runs tiffmedian -c 16 to produce a palette TIFF, and verifies PhotometricInterpretation=3 (RGB Palette), BitsPerSample=8 and PIL mode P on reload.
Pillow TIFF tiffsplit on 2-page TIFF Original / libtiff / usage-python3-pil-tiff-tiffsplit-2-pages Passed
Writes a minimal 2-page multipage TIFF with Pillow, runs tiffsplit, and verifies exactly two single-frame outputs are produced (page-aaa.tif and page-aab.tif) with the original per-page solid colors preserved.
Pillow TIFF tiffsplit on 5-page TIFF Original / libtiff / usage-python3-pil-tiff-tiffsplit-five-pages Passed
Writes a 5-page TIFF with Pillow, runs tiffsplit to produce 5 single-page files, and verifies each output has exactly one frame and the dominant color matches the source page index.
Pillow TIFF tiffsplit multipage split Original / libtiff / usage-python3-pil-tiff-tiffsplit-multipage Passed
Writes a 3-page TIFF with Pillow, runs tiffsplit to split it, and verifies that 3 single-page output files are produced with expected name pattern and each contains exactly one frame.
Pillow TIFF tiffsplit on a single-page input (degenerate) Original / libtiff / usage-python3-pil-tiff-tiffsplit-single-page-degenerate Passed
Writes a one-page TIFF with Pillow, runs tiffsplit, and verifies the degenerate case: exactly one output file (page-aaa.tif) is produced, no page-aab.tif appears, and the lone fragment round-trips through Pillow with size, mode, and solid-color pixel preserved.
Pillow TIFF tiled layout tile width and length tags Original / libtiff / usage-python3-pil-tiff-tile-width-length-tags Passed
Pillow saves a stripped TIFF, tiffcp repackages it as 32x32 tiles, and Pillow reload exposes tag_v2 TileWidth (322) and TileLength (323) both equal to 32 plus consistent TileOffsets and TileByteCounts arrays.
Pillow TIFF to BMP Original / libtiff / usage-python3-pil-tiff-to-bmp Passed
Pillow TIFF to JPEG Original / libtiff / usage-python3-pil-tiff-to-jpeg Passed
Pillow TIFF to PNG Original / libtiff / usage-python3-pil-tiff-to-png Passed
Pillow TIFF tobytes length Original / libtiff / usage-python3-pil-tiff-tobytes-length-batch11 Passed
Pillow transposes TIFF Original / libtiff / usage-python3-pil-transpose-tiff Passed
Pillow transverse generated TIFF Original / libtiff / usage-python3-pil-transverse-generated-tiff Passed
Applies Pillow transverse transpose to a generated TIFF and verifies both the swapped dimensions and mapped corner pixels before round-tripping.
Pillow uncompressed TIFF Original / libtiff / usage-python3-pil-uncompressed-tiff Passed
CVE-2004-0804 libtiff regression Original / libtiff / cve-2004-0804 Passed
Asserts that tiffinfo rejects a TIFF with zero ImageLength without dividing by it inside tif_dirread row-bytes arithmetic.
CVE-2005-2452 libtiff regression Original / libtiff / cve-2005-2452 Passed
Asserts that tiffinfo rejects a YCbCr TIFF whose YCbCrSubSampling tag declares zero horizontal/vertical sampling without dividing by zero in strip-size arithmetic.
CVE-2006-3463 libtiff regression Original / libtiff / cve-2006-3463 Passed
Asserts that EstimateStripByteCounts terminates in bounded time when the StripOffsets/StripByteCounts arrays declare a 32-bit strip count that previously overflowed a 16-bit loop counter.
CVE-2014-8130 libtiff regression Original / libtiff / cve-2014-8130 Passed
Asserts that libtiff rejects a TIFF declaring zero BitsPerSample without producing a divide-by-zero exception inside scanline-size arithmetic.
CVE-2017-11613 libtiff regression Original / libtiff / cve-2017-11613 Passed
Asserts that TIFFOpen rejects a directory whose ImageLength would drive ChopUpSingleUncompressedStrip to request enormous allocations, without crashing or hanging.
CVE-2018-5784 libtiff regression Original / libtiff / cve-2018-5784 Passed
Asserts that TIFFSetDirectory rejects a directory whose declared entry count is far larger than the file actually contains, without entering an unbounded allocation or read loop.
CVE-2019-14973 libtiff regression Original / libtiff / cve-2019-14973 Passed
Asserts that _TIFFCheckMalloc rejects a request whose size arithmetic would have relied on undefined signed-overflow behaviour, surfacing a clean error rather than producing the multiplication-wrap allocation.
CVE-2022-40090 libtiff regression Original / libtiff / cve-2022-40090 Passed
Asserts that TIFFReadDirectory terminates in bounded time on a TIFF whose IFD chain points back to itself, instead of looping forever through repeated directory offsets.
CVE-2023-52355 libtiff regression Original / libtiff / cve-2023-52355 Passed
Asserts that TIFFRasterScanlineSize64 rejects an ImageWidth that would overflow scanline-size arithmetic instead of producing the impractically large allocation request.
CVE-2023-6277 libtiff regression Original / libtiff / cve-2023-6277 Passed
Asserts that TIFFOpen rejects a tiny crafted TIFF whose declared dimensions would otherwise drive an out-of-memory allocation pattern, in bounded time.
libtiff C API read write Port / libtiff / c-api-read-write Passed
Malformed TIFF rejection Port / libtiff / malformed-tiff-rejection Passed
tiffcp copy behavior Port / libtiff / tiffcp-copy Passed
tiffdump structure inspection Port / libtiff / tiffdump-structure Passed
tiffinfo metadata inspection Port / libtiff / tiffinfo-metadata Passed
Pillow add mirror TIFF Port / libtiff / usage-python3-pil-add-mirror-tiff Passed
Uses Pillow ImageChops.add on a generated TIFF and its mirrored copy and verifies the summed pixel values before round-tripping.
Pillow add_modulo mirror TIFF Port / libtiff / usage-python3-pil-add-modulo-mirror-tiff Passed
Uses Pillow ImageChops.add_modulo on a generated TIFF and its mirrored copy and verifies the modular per-channel sums before round-tripping.
python PIL autocontrast TIFF Port / libtiff / usage-python3-pil-autocontrast-tiff Passed
Pillow bilevel TIFF Port / libtiff / usage-python3-pil-bilevel-tiff Passed
Pillow bilinear resize TIFF Port / libtiff / usage-python3-pil-bilinear-resize-tiff Passed
Pillow blend mirror TIFF Port / libtiff / usage-python3-pil-blend-mirror-tiff Passed
Blends a generated TIFF with its mirrored copy in Pillow and verifies the blended pixel average before round-tripping.
Pillow blend alpha one TIFF Port / libtiff / usage-python3-pil-blend-one-mirror-tiff Passed
Uses Pillow Image.blend with alpha one on a generated TIFF and verifies the result equals the mirrored image pixel-for-pixel before round-tripping.
Pillow blend alpha zero TIFF Port / libtiff / usage-python3-pil-blend-zero-mirror-tiff Passed
Uses Pillow Image.blend with alpha zero on a generated TIFF and verifies the result equals the original image pixel-for-pixel before round-tripping.
python PIL border expand TIFF Port / libtiff / usage-python3-pil-border-expand-tiff Passed
Pillow opens TIFF from memory Port / libtiff / usage-python3-pil-bytesio-open-tiff Passed
Loads a TIFF from an in-memory byte buffer with Pillow and verifies the decoded image dimensions.
python PIL canvas paste TIFF Port / libtiff / usage-python3-pil-canvas-paste-tiff Passed
Pillow CMYK TIFF Port / libtiff / usage-python3-pil-cmyk-tiff Passed
Pillow composite halves TIFF Port / libtiff / usage-python3-pil-composite-halves-tiff Passed
Composites a generated TIFF with its mirrored copy through a half-image mask in Pillow and verifies left and right pixels come from different sources.
Pillow convert tiff Port / libtiff / usage-python3-pil-convert-tiff Passed
python PIL crop generated TIFF Port / libtiff / usage-python3-pil-crop-generated-tiff Passed
Pillow crop tiff Port / libtiff / usage-python3-pil-crop-tiff Passed
Pillow darker mirror TIFF Port / libtiff / usage-python3-pil-darker-mirror-tiff Passed
Uses Pillow ImageChops.darker on a generated TIFF and its mirrored copy and verifies the per-channel minima before round-tripping.
Pillow Deflate TIFF save Port / libtiff / usage-python3-pil-deflate-tiff Passed
Pillow difference mirror TIFF Port / libtiff / usage-python3-pil-difference-mirror-tiff Passed
Uses Pillow ImageChops.difference on a generated TIFF and its mirrored copy and verifies the absolute per-channel difference values before round-tripping.
Pillow duplicate darker TIFF Port / libtiff / usage-python3-pil-duplicate-darker-tiff Passed
Uses Pillow ImageChops.darker on a generated TIFF against its own copy and verifies every pixel matches the original before round-tripping.
python PIL equalize TIFF Port / libtiff / usage-python3-pil-equalize-tiff Passed
python PIL detail filter TIFF Port / libtiff / usage-python3-pil-filter-detail-tiff Passed
python PIL fit TIFF Port / libtiff / usage-python3-pil-fit-tiff Passed
Pillow flips TIFF vertically Port / libtiff / usage-python3-pil-flip-topbottom-tiff Passed
Pillow flip twice identity TIFF Port / libtiff / usage-python3-pil-flip-twice-identity-tiff Passed
Flips a generated TIFF twice with ImageOps.flip and verifies the result matches the original pixel-for-pixel before round-tripping.
Pillow floating point TIFF Port / libtiff / usage-python3-pil-float-tiff Passed
Pillow TIFF bounding box Port / libtiff / usage-python3-pil-getbbox-tiff Passed
Computes a bounding box for a TIFF with Pillow and verifies a valid four-value rectangle is returned.
python PIL getextrema TIFF Port / libtiff / usage-python3-pil-getextrema-tiff Passed
Pillow grayscale add TIFF Port / libtiff / usage-python3-pil-grayscale-add-tiff Passed
Converts a generated TIFF to L mode and adds its mirrored copy with ImageChops.add, verifying the saturated luminance sum before saving.
Pillow grayscale TIFF Port / libtiff / usage-python3-pil-grayscale-tiff Passed
python PIL histogram TIFF Port / libtiff / usage-python3-pil-histogram-tiff Passed
Pillow TIFF info dictionary Port / libtiff / usage-python3-pil-icc-info-tiff Passed
Pillow invert generated TIFF Port / libtiff / usage-python3-pil-invert-generated-tiff Passed
Uses Pillow ImageOps.invert on a generated TIFF and verifies the inverted channel values before round-tripping.
Pillow invert mirror lighter TIFF Port / libtiff / usage-python3-pil-invert-mirror-mirror-tiff Passed
Inverts a mirrored TIFF with ImageOps.invert and lighter-merges with the original, verifying the per-channel lighter pixel values before round-tripping.
python PIL invert point TIFF Port / libtiff / usage-python3-pil-invert-point-tiff Passed
python PIL L mode TIFF Port / libtiff / usage-python3-pil-l-mode-tiff Passed
Pillow LA mode TIFF Port / libtiff / usage-python3-pil-la-mode-tiff Passed
Saves an LA-mode TIFF with Pillow and verifies the reloaded image preserves the grayscale-plus-alpha mode.
Pillow lighter mirror TIFF Port / libtiff / usage-python3-pil-lighter-mirror-tiff Passed
Uses Pillow ImageChops.lighter on a generated TIFF and its mirrored copy and verifies the per-channel maxima before round-tripping.
Pillow lzw tiff Port / libtiff / usage-python3-pil-lzw-tiff Passed
Pillow mirrors TIFF left right Port / libtiff / usage-python3-pil-mirror-left-right-tiff Passed
Pillow mirror twice identity TIFF Port / libtiff / usage-python3-pil-mirror-twice-identity-tiff Passed
Mirrors a generated TIFF twice with ImageOps.mirror and verifies the result matches the original pixel-for-pixel before round-tripping.
Pillow multiframe TIFF count Port / libtiff / usage-python3-pil-multiframe-count-tiff Passed
Pillow TIFF frame seek Port / libtiff / usage-python3-pil-multiframe-seek-tiff Passed
Pillow multipage tiff Port / libtiff / usage-python3-pil-multipage-tiff Passed
Pillow multiply mirror TIFF Port / libtiff / usage-python3-pil-multiply-mirror-tiff Passed
Uses Pillow ImageChops.multiply on a generated TIFF and its mirrored copy and verifies the multiplied pixel values before round-tripping.
python PIL offset TIFF Port / libtiff / usage-python3-pil-offset-tiff Passed
Pillow open tiff Port / libtiff / usage-python3-pil-open-tiff Passed
Pillow PackBits TIFF Port / libtiff / usage-python3-pil-packbits-tiff Passed
python PIL pad TIFF Port / libtiff / usage-python3-pil-pad-tiff Passed
Pillow palette TIFF Port / libtiff / usage-python3-pil-palette-tiff Passed
Pillow pastes TIFF region Port / libtiff / usage-python3-pil-paste-region-tiff Passed
Pillow point shift TIFF Port / libtiff / usage-python3-pil-point-shift-tiff Passed
Applies a point-wise channel offset to a TIFF with Pillow and verifies the saved output remains decodable.
python PIL quantize TIFF Port / libtiff / usage-python3-pil-quantize-tiff Passed
BitsPerSample tag is a triple of 8s for an RGB Pillow TIFF Port / libtiff / usage-python3-pil-r10-tiff-bitspersample-rgb-triple Passed
Saves an RGB TIFF with Pillow and verifies tag_v2[258] BitsPerSample is exposed as a length-3 tuple where every entry equals 8, matching the three RGB samples per pixel.
Pillow TIFFs default to FillOrder MSB2LSB (1) Port / libtiff / usage-python3-pil-r10-tiff-fillorder-default-msb2lsb Passed
Saves a default RGB TIFF with Pillow and reads tag 266 back, asserting FillOrder defaults to 1 (MSB-to-LSB) when not explicitly set, matching the libtiff baseline.
pal2rgb expands a Pillow palette TIFF into RGB samples Port / libtiff / usage-python3-pil-r10-tiff-pal2rgb-palette-to-rgb Passed
Saves a P-mode TIFF with Pillow, runs pal2rgb to convert it to RGB, and verifies the result reopens with mode RGB, SamplesPerPixel=3, and PhotometricInterpretation=2 (RGB).
ppm2tiff converts a synthetic PPM into a Pillow-readable TIFF Port / libtiff / usage-python3-pil-r10-tiff-ppm2tiff-roundtrip Passed
Writes a small binary PPM, runs ppm2tiff to wrap it as TIFF, and verifies Pillow opens the result with mode RGB, the expected size, and pixel data matching the source PPM bytes.
tiff2pdf -j packs a Pillow JPEG-compressed TIFF into a PDF Port / libtiff / usage-python3-pil-r10-tiff-tiff2pdf-jpeg-output Passed
Saves a JPEG-compressed RGB TIFF with Pillow, runs tiff2pdf -j to wrap it as a PDF, and verifies the output begins with the %PDF-1 magic and ends with the %%EOF trailer.
tiff2ps emits a PostScript stream from a Pillow TIFF Port / libtiff / usage-python3-pil-r10-tiff-tiff2ps-postscript-magic Passed
Saves an RGB TIFF with Pillow, runs tiff2ps to convert it, and verifies the output begins with the %!PS-Adobe magic and contains a %%BoundingBox header.
tiff2rgba expands a Pillow palette TIFF into RGBA samples Port / libtiff / usage-python3-pil-r10-tiff-tiff2rgba-palette-to-rgba Passed
Saves a P-mode palette TIFF with Pillow, runs tiff2rgba to convert it, and verifies the result reopens as RGBA with SamplesPerPixel=4 and the original geometry preserved.
tiffcmp returns success on byte-equal Pillow TIFF copies Port / libtiff / usage-python3-pil-r10-tiff-tiffcmp-equal-files Passed
Saves an RGB TIFF with Pillow, copies it to a second file, and verifies tiffcmp exits 0 with no diff lines printed.
Pillow mode "1" bilevel TIFF passes through libtiff's tiffcp -c lzw Port / libtiff / usage-python3-pil-r10-tiff-tiffdither-bilevel-output Passed
Saves a Pillow mode "1" (1-bit) bilevel TIFF and round-trips it through libtiff's tiffcp -c lzw, then verifies the output is still a 1-bit, 32x16 TIFF with LZW compression via tiffinfo, exercising libtiff's bilevel reader and the LZW codec on Pillow-produced 1-bit imagery. (libtiff's tiffdither tool refuses Pillow output with "Not a b&w image" because Pillow's mode-L default save varies in SamplesPerPixel/PhotometricInterpretation — tiffcp on a true 1-bit source is the documented stable surface.)
tiffset rewrites Software tag on a Pillow TIFF Port / libtiff / usage-python3-pil-r10-tiff-tiffset-software-tag Passed
Saves an RGB TIFF with Pillow, uses tiffset -s 305 to overwrite the Software tag, and verifies Pillow reads the new value back from tag_v2[305].
PIL TIFF saved from mode "1" reports min-is-black photometric Port / libtiff / usage-python3-pil-r11-tiff-bilevel-mode-photometric Passed
Saves a Pillow mode='1' bilevel image to TIFF and verifies tiffinfo reports "Photometric Interpretation: min-is-black" (PhotometricInterpretation tag value 1) which is the libtiff convention for 1-bit bitmaps written from PIL.
PIL CMYK TIFF reports separated photometric and SamplesPerPixel 4 Port / libtiff / usage-python3-pil-r11-tiff-cmyk-photometric-separated Passed
Saves a Pillow CMYK image to TIFF and verifies tiffinfo reports "Photometric Interpretation: separated" and "Samples/Pixel: 4", reflecting the four ink channels of CMYK.
PIL bilevel TIFF saved with group4 reports CCITT Group 4 compression Port / libtiff / usage-python3-pil-r11-tiff-group4-fax-compression Passed
Saves a Pillow mode='1' bilevel image to TIFF with compression='group4' and verifies tag_v2[259] == 4 (CCITT Group 4) and tiffinfo reports "Compression Scheme: CCITT Group 4".
PIL I;16 grayscale TIFF reports BitsPerSample 16 Port / libtiff / usage-python3-pil-r11-tiff-i16-bits-per-sample-16 Passed
Saves a Pillow mode='I;16' grayscale TIFF and verifies tag_v2[258] BitsPerSample == 16 and tiffinfo reports "Bits/Sample: 16", reflecting the 16-bit unsigned integer sample format used by I;16 grayscale.
PIL TIFF saved with packbits sets Compression tag to 32773 Port / libtiff / usage-python3-pil-r11-tiff-packbits-compression-tag Passed
Saves an RGB TIFF with Pillow compression='packbits' and verifies tag_v2[259] == 32773 (PackBits) and tiffinfo reports "Compression Scheme: PackBits".
raw2tiff wraps an 8-bit grayscale buffer with declared geometry Port / libtiff / usage-python3-pil-r11-tiff-raw2tiff-grayscale-roundtrip Passed
Writes a deterministic 20x15 byte ramp to a raw file, runs raw2tiff with -w 20 -l 15 -b 1 -d byte, and verifies tiffinfo reports the exact ImageWidth/ImageLength and 8 bits-per-sample on the produced TIFF.
PIL RGBA TIFF tags ExtraSamples=2 (unassociated alpha) and Samples/Pixel=4 Port / libtiff / usage-python3-pil-r11-tiff-rgba-extra-samples-alpha Passed
Saves a Pillow RGBA TIFF and verifies tag_v2[277] SamplesPerPixel == 4 and tag_v2[338] ExtraSamples == (2,) (UNASSALPHA), confirming the alpha channel is recorded as unassociated alpha rather than premultiplied.
tiff2pdf produces a PDF whose page count matches the multi-page TIFF Port / libtiff / usage-python3-pil-r11-tiff-tiff2pdf-multipage-page-count Passed
Builds a 4-page TIFF with Pillow save_all + append_images, runs tiff2pdf, and verifies pdfinfo reports exactly Pages: 4 in the output PDF.
tiffset rewrites the Orientation tag and tiffinfo reports the new sense Port / libtiff / usage-python3-pil-r11-tiff-tiffset-orientation-tag Passed
Saves an RGB TIFF, runs tiffset -s 274 6 to set Orientation=6 (row 0 rhs, col 0 top), and verifies tiffinfo's "Orientation" line reports the new orientation token rather than the default.
tiffsplit with explicit prefix produces aaa/aab/aac single-image files Port / libtiff / usage-python3-pil-r11-tiff-tiffsplit-prefix-output-naming Passed
Builds a 3-page TIFF and runs tiffsplit with an explicit prefix; verifies the resulting files are named "<prefix>aaa.tif", "<prefix>aab.tif", "<prefix>aac.tif" (libtiff's deterministic alphabetic suffix sequence) and each contains exactly one TIFF directory.
PIL I;16 TIFF preserves a 40000 pixel value through libtiff write/read Port / libtiff / usage-python3-pil-r12-tiff-16bit-grayscale-pixel-roundtrip Passed
Saves an I;16 grayscale TIFF whose every pixel is 40000 and verifies the reopened image's mode is 'I;16' and getpixel((0,0)) returns 40000 unchanged, asserting libtiff stores 16-bit grayscale samples without truncation to 8 bits.
PIL TIFF saved with tiff_adobe_deflate sets Compression tag 8 and tiffinfo reports AdobeDeflate Port / libtiff / usage-python3-pil-r12-tiff-adobe-deflate-compression-tag-8 Passed
Saves an RGB TIFF with Pillow compression='tiff_adobe_deflate' and verifies tag_v2[259] == 8 (AdobeDeflate) and tiffinfo reports "Compression Scheme: AdobeDeflate", the modern z-streams TIFF codec id.
PIL TIFF saved with tiff_deflate sets Compression tag 32946 Port / libtiff / usage-python3-pil-r12-tiff-deflate-compression-tag-32946 Passed
Saves an RGB TIFF with Pillow compression='tiff_deflate' and verifies tag_v2[259] == 32946 (Deflate, original Adobe TIFF Technical Note 2 codec id), distinguishing it from the alternative tiff_adobe_deflate value 8.
PIL TIFF saved with tiff_lzw sets Compression tag 5 and tiffinfo reports LZW Port / libtiff / usage-python3-pil-r12-tiff-lzw-compression-tag-5 Passed
Saves an RGB TIFF with Pillow compression='tiff_lzw' and verifies tag_v2[259] == 5 (LZW) and tiffinfo reports "Compression Scheme: LZW", asserting the libtiff LZW codec path from Pillow.
PIL Image.n_frames reports 3 for a three-page TIFF Port / libtiff / usage-python3-pil-r12-tiff-multipage-n-frames-three Passed
Builds a 3-page TIFF using save_all and append_images and verifies Image.n_frames == 3 on reopen, reflecting the libtiff multi-directory layout discovered by Pillow.
PIL TIFF seek/tell cycle through frames matches the seeked index Port / libtiff / usage-python3-pil-r12-tiff-multipage-seek-tell-cycle Passed
Builds a 4-page TIFF with distinct solid colors and verifies Image.seek(i) followed by Image.tell() == i for i in 0..3, asserting the libtiff IFD walking is invoked correctly through Pillow.
PIL TIFF saved with compression='raw' sets Compression tag 1 (none) Port / libtiff / usage-python3-pil-r12-tiff-raw-uncompressed-compression-tag-1 Passed
Saves an RGB TIFF with Pillow compression='raw' and verifies tag_v2[259] == 1 (no compression), exercising the explicit no-compression Pillow alias.
PIL TIFF saved with dpi=(300,300) reports ResolutionUnit=2 (inch) Port / libtiff / usage-python3-pil-r12-tiff-resolution-unit-tag-2-inch Passed
Saves an RGB TIFF with Pillow dpi=(300,300) and verifies tag_v2[296] ResolutionUnit == 2 (inch) and tag_v2[282] XResolution and tag_v2[283] YResolution evaluate to 300, asserting the tag is set even when unit is the libtiff default.
PIL TIFF Software (305) and ImageDescription (270) round-trip via tiffinfo Port / libtiff / usage-python3-pil-r12-tiff-software-and-imagedescription-tags Passed
Saves a TIFF with explicit Software and ImageDescription string tags via Pillow's tiffinfo argument and verifies tiffinfo reports both lines verbatim and Pillow re-reads tag_v2[305] and tag_v2[270] with the same values.
tiffcp converts a Pillow stripped TIFF into a tiled TIFF with TileWidth/TileLength=64 Port / libtiff / usage-python3-pil-r12-tiff-tile-options-tagged Passed
Saves an RGB TIFF with Pillow (stripped layout) and runs libtiff's tiffcp -t -w 64 -l 64 to convert it into a tiled TIFF, then asserts tiffinfo reports "Tile Width: 64" and "Tile Length: 64" in the output metadata. (Pillow's TIFF writer does not honour a "tile" save kwarg; tiffcp is the libtiff-side surface for producing tiled imagery and is what this test exercises.)
PIL bilevel TIFF saved with group3 reports CCITT Group 3 in tiffinfo Port / libtiff / usage-python3-pil-r13-tiff-ccitt-fax-t4-bilevel Passed
Saves a Pillow mode='1' bilevel image with compression='group3' and verifies tiffinfo reports "Compression Scheme: CCITT Group 3" on the resulting file, asserting the libtiff Group 3 (T.4) fax codec round-trips through Pillow.
PIL F mode TIFF preserves a 0.5 float pixel through libtiff Port / libtiff / usage-python3-pil-r13-tiff-f-mode-float-zero-readback Passed
Builds a Pillow mode "F" image filled with 0.5, saves it as TIFF, and verifies the reopened mode is "F", size is unchanged, and getpixel((0,0)) is exactly 0.5 (representable as float32), asserting libtiff stores 32-bit IEEE float samples without quantisation.
PIL TIFF getexif() round-trips a DateTime ASCII (tag 306) through libtiff Port / libtiff / usage-python3-pil-r13-tiff-getexif-datetime-tag-306 Passed
Builds a Pillow Exif object with tag 306 = "2026:05:06 12:00:00", saves an RGB TIFF using exif=exif, and verifies on reopen that getexif()[306] decodes to the same string (after stripping any trailing NUL or bytes->str), asserting libtiff carries the EXIF DateTime ASCII through the Pillow round-trip.
PIL I;16 TIFF retains a 65000 pixel value on reload Port / libtiff / usage-python3-pil-r13-tiff-i16-pixel-65000-roundtrip Passed
Writes a Pillow I;16 grayscale TIFF whose every pixel is 65000 (near the 16-bit ceiling) and verifies the reopened image's mode is "I;16" and getpixel((4,2)) returns 65000 unchanged, asserting libtiff carries 16-bit grayscale samples without 8-bit truncation.
PIL TIFF description kwarg writes ImageDescription tag 270 readable on reopen Port / libtiff / usage-python3-pil-r13-tiff-imagedescription-via-description-kwarg Passed
Saves a Pillow TIFF with the description= keyword and verifies on reopen that tag_v2.get(270) (ImageDescription) returns the same ASCII string, asserting Pillow forwards the keyword into the libtiff IFD.
PIL TIFF saved with tiff_adobe_deflate reports info["compression"] as a deflate variant Port / libtiff / usage-python3-pil-r13-tiff-info-compression-string-deflate Passed
Saves an RGB TIFF with Pillow compression='tiff_adobe_deflate' and verifies image.info["compression"] is one of the documented deflate string ids ("tiff_adobe_deflate" or "tiff_deflate"), exercising the libtiff zip codec discovery path through the Pillow info dictionary rather than via the numeric Compression tag.
PIL TIFF saved with tiff_lzw exposes info["compression"] string "tiff_lzw" Port / libtiff / usage-python3-pil-r13-tiff-info-compression-string-lzw Passed
Saves an RGB TIFF with Pillow compression='tiff_lzw' and verifies that on reopen image.info["compression"] is the literal string "tiff_lzw" (PIL's string id, not the numeric tag), asserting the libtiff LZW codec is announced through the Pillow info dict.
PIL TIFF saved with compression='raw' reports info["compression"] == "raw" Port / libtiff / usage-python3-pil-r13-tiff-info-compression-string-raw Passed
Saves an RGB TIFF with Pillow compression='raw' (no compression) and verifies image.info["compression"] is exactly the string "raw", asserting Pillow propagates the "uncompressed" alias verbatim through the libtiff write path on reopen.
PIL TIFF dpi=(150,150) round-trips through image.info["dpi"] Port / libtiff / usage-python3-pil-r13-tiff-info-dpi-150-tuple Passed
Saves an RGB TIFF with dpi=(150,150) and verifies image.info["dpi"] on reopen evaluates to (150.0, 150.0) when each entry is cast to float, asserting Pillow's TIFF reader pulls XResolution/YResolution into the info dict consistent with the libtiff write of those rationals.
PIL TIFF save_all + append_images builds a 5-frame TIFF Port / libtiff / usage-python3-pil-r13-tiff-multipage-save-all-five-frames Passed
Saves five distinct solid-color RGB pages to a single TIFF using save_all=True with append_images of length four, then verifies Image.n_frames == 5 on reopen, asserting libtiff records all five IFDs and Pillow walks them.
PIL TIFF dpi=(72,72) round-trips through image.info["dpi"] Port / libtiff / usage-python3-pil-r14-tiff-dpi-72-tuple-roundtrip Passed
Saves an RGB TIFF with dpi=(72,72) and verifies image.info["dpi"] on reopen evaluates to (72.0, 72.0) when each entry is cast to float, asserting Pillow's TIFF reader pulls XResolution/YResolution into the info dict consistent with the libtiff write of those rationals at the screen-typical 72 dpi.
PIL TIFF getexif() round-trips Make (271) and Model (272) ASCII strings Port / libtiff / usage-python3-pil-r14-tiff-getexif-make-model-roundtrip Passed
Builds a Pillow Exif object with tag 271 (Make) = "ValidatorCo" and 272 (Model) = "ValidatorCam X1", saves an RGB TIFF using exif=exif, and verifies on reopen that getexif()[271] and getexif()[272] decode (after stripping any trailing NUL or bytes->str) to the same strings, asserting libtiff carries the Make/Model ASCII through the Pillow round-trip.
PIL TIFF tag_v2[257] (ImageLength) reads back the saved image height Port / libtiff / usage-python3-pil-r14-tiff-imagelength-tag-257-readback Passed
Saves a 19x43 RGB TIFF and verifies that tag_v2.get(257) (ImageLength) on reopen equals 43 (matching image.size[1]), asserting libtiff records the canonical ImageLength tag and Pillow surfaces it as an integer through the v2 IFD.
PIL TIFF tag_v2[256] (ImageWidth) reads back the saved image width Port / libtiff / usage-python3-pil-r14-tiff-imagewidth-tag-256-readback Passed
Saves a 37x21 RGB TIFF and verifies that tag_v2.get(256) (ImageWidth) on reopen equals 37 (matching image.size[0]), asserting libtiff records the canonical ImageWidth tag and Pillow surfaces it as an integer through the v2 IFD.
PIL bilevel TIFF saved with group3 exposes info["compression"] string "group3" Port / libtiff / usage-python3-pil-r14-tiff-info-compression-string-group3 Passed
Saves a mode "1" bilevel TIFF with Pillow compression='group3' and verifies image.info["compression"] equals "group3" (PIL's string id for the CCITT T.4 codec, numeric Compression tag value 3) on reopen, asserting libtiff's Group 3 fax codec is announced through the Pillow info dict.
PIL bilevel TIFF saved with group4 exposes info["compression"] string "group4" Port / libtiff / usage-python3-pil-r14-tiff-info-compression-string-group4 Passed
Saves a mode "1" bilevel TIFF with Pillow compression='group4' and verifies image.info["compression"] equals "group4" (PIL's string id for the CCITT T.6 codec, numeric Compression tag value 4) on reopen, asserting libtiff's Group 4 fax codec is announced through the Pillow info dict.
PIL TIFF saved with packbits exposes info["compression"] string "packbits" Port / libtiff / usage-python3-pil-r14-tiff-info-compression-string-packbits Passed
Saves an RGB TIFF with Pillow compression='packbits' and verifies that on reopen image.info["compression"] is exactly the literal string "packbits" (PIL's string id, not the numeric tag value 32773), asserting the libtiff PackBits codec is announced through the Pillow info dict.
PIL TIFF saved with jpeg compression exposes info["compression"] as a jpeg id Port / libtiff / usage-python3-pil-r14-tiff-info-compression-string-tiff-jpeg Passed
Saves an RGB TIFF with Pillow compression='jpeg' and verifies image.info["compression"] is one of the jpeg-family string ids ("jpeg" or "tiff_jpeg") on reopen, asserting libtiff's JPEG-in-TIFF codec is announced through the Pillow info dict rather than via the numeric Compression tag (7).
PIL TIFF mode "1" 1-bit bilevel image round-trips with BitsPerSample == 1 Port / libtiff / usage-python3-pil-r14-tiff-mode-1-1bit-bilevel-roundtrip Passed
Saves a mode "1" bilevel TIFF and verifies on reopen that the mode is still "1" (which PIL only assigns when libtiff's BitsPerSample is 1 and PhotometricInterpretation is 0/1). If tag_v2[258] is surfaced, also assert it equals 1; PIL on noble does not always populate this entry on read, so a missing value is tolerated as long as the mode round-trips.
PIL TIFF mode "RGBA" round-trips and exposes a 4th alpha band on reopen Port / libtiff / usage-python3-pil-r14-tiff-mode-rgba-alpha-channel-roundtrip Passed
Saves a mode "RGBA" TIFF with a non-trivial alpha channel and verifies on reopen that mode == "RGBA", split() produces 4 bands, and the alpha band's getextrema() returns the expected (min,max) tuple, asserting libtiff round-trips the alpha sample through Pillow.
PIL TIFF getexif() round-trips ImageDescription ASCII (tag 270) through libtiff Port / libtiff / usage-python3-pil-r15-tiff-getexif-imagedescription-tag-270 Passed
Builds a Pillow Exif object with tag 270 (ImageDescription) = "validator r15 description", saves an RGB TIFF using exif=ex, and verifies on reopen that getexif()[270] decodes to the same string after stripping trailing NUL bytes, asserting libtiff carries the ImageDescription ASCII through Pillow's getexif() round-trip.
PIL TIFF getexif() round-trips a Software ASCII (tag 305) through libtiff Port / libtiff / usage-python3-pil-r15-tiff-getexif-software-tag-305 Passed
Builds a Pillow Exif object with tag 305 = "ValidatorR15Software", saves an RGB TIFF using exif=ex, and verifies on reopen that getexif()[305] decodes to the same string after stripping any trailing NUL byte (or bytes->str), asserting libtiff carries the Software ASCII through Pillow's getexif() round-trip.
PIL TIFF dpi=(300,300) round-trips through image.info["dpi"] Port / libtiff / usage-python3-pil-r15-tiff-info-dpi-300-tuple Passed
Saves an RGB TIFF with dpi=(300,300) and verifies that on reopen the image.info["dpi"] tuple, when each entry is cast to float, equals (300.0, 300.0), asserting Pillow surfaces the libtiff XResolution/YResolution rationals at print-typical 300 dpi.
PIL TIFF dpi=(200,100) preserves asymmetric X/Y resolution on round-trip Port / libtiff / usage-python3-pil-r15-tiff-info-dpi-asymmetric-200x100 Passed
Saves an RGB TIFF with an asymmetric dpi=(200,100) (XResolution != YResolution), then verifies on reopen that image.info["dpi"] cast to floats equals (200.0, 100.0), asserting libtiff retains the X and Y resolution rationals independently rather than collapsing them to a single value.
PIL mode "F" TIFF retains a fractional 0.5 pixel value on reload Port / libtiff / usage-python3-pil-r15-tiff-mode-f-float-half-pixel-roundtrip Passed
Writes a Pillow mode "F" (float32) TIFF whose every pixel is 0.5 and verifies the reopened image's mode is "F" and getpixel((1,1)) is exactly 0.5 (well-represented in IEEE-754 float32), asserting libtiff carries float32 sample values through Pillow's mode "F" round-trip without rounding to integer.
PIL mode "I" (int32) TIFF retains a 100000 pixel value on reload Port / libtiff / usage-python3-pil-r15-tiff-mode-i-int32-pixel-roundtrip Passed
Writes a Pillow mode "I" (int32 signed) TIFF whose every pixel is 100000 (well outside the 16-bit range) and verifies the reopened image's mode begins with "I" and getpixel((2,2)) returns 100000 unchanged, asserting libtiff carries 32-bit integer samples without truncating to 16 or 8 bits.
PIL I;16 TIFF reports the expected extrema for a flat 32000 image Port / libtiff / usage-python3-pil-r15-tiff-mode-i16-extrema-roundtrip Passed
Writes a Pillow I;16 grayscale TIFF whose every pixel is 32000 and verifies the reopened image's mode is "I;16" and getextrema() returns (32000, 32000), asserting libtiff carries 16-bit grayscale samples and Pillow surfaces both extrema accurately for a uniform image.
PIL mode "L" TIFF carries a 200 pixel value through getpixel after reopen Port / libtiff / usage-python3-pil-r15-tiff-mode-l-getpixel-200-roundtrip Passed
Writes a Pillow mode "L" TIFF whose every pixel is 200 (mid-bright 8-bit grayscale) and verifies the reopened image's mode is "L", size is preserved, and getpixel((3,1)) returns 200 unchanged, asserting libtiff round-trips 8-bit grayscale samples without value distortion.
PIL TIFF save_all + seek(2) reaches the third page with its expected color Port / libtiff / usage-python3-pil-r15-tiff-multipage-seek-frame-2-pixel Passed
Saves three distinct solid-color RGB pages (red, green, blue) to a single TIFF using save_all=True with append_images of length two, then verifies on reopen that n_frames == 3, im.seek(2) succeeds, and getpixel((0, 0)) of the third frame returns (0, 0, 255), asserting libtiff records all three IFDs and Pillow can navigate to the third frame and recover its pixel data.
PIL RGBA TIFF returns the exact corner pixel via getpixel after reopen Port / libtiff / usage-python3-pil-r15-tiff-rgba-getpixel-corner-roundtrip Passed
Writes a Pillow mode "RGBA" TIFF filled with (12, 34, 56, 78) and verifies on reopen that mode == "RGBA" and getpixel((0, 0)) returns the same 4-tuple unchanged, asserting libtiff carries all four 8-bit RGBA samples without channel reordering or alpha drop.
PIL TIFF DateTime tag 306 written via tiffinfo dict survives a save+reopen Port / libtiff / usage-python3-pil-r16-tiff-datetime-tag-306-roundtrip Passed
Saves a small RGB TIFF with tag_v2 DateTime 306 supplied via the tiffinfo kwarg, reopens the file with Pillow, and asserts tag_v2[306] equals the original ASCII timestamp, exercising libtiff's ASCII DateTime tag write/read.
PIL TIFF save without save_all writes a single-frame file even after a prior multi-frame save Port / libtiff / usage-python3-pil-r16-tiff-default-append-false-overwrites Passed
Writes a 3-frame multi-page TIFF with save_all=True, then re-saves to the same path with a single image and the default save_all=False, reopens with Pillow, asserts n_frames is 1, mode is L, and the only frame's (0,0) pixel matches the single-image value — exercising Pillow's default non-append save behaviour atop libtiff.
PIL I;16 TIFF preserves mode I;16 and 10x7 dimensions across save and reopen Port / libtiff / usage-python3-pil-r16-tiff-i16-roundtrip-size-and-mode Passed
Saves a 10x7 I;16 image with constant value 12345 as a TIFF, reopens with Pillow, asserts the reopened mode is exactly "I;16", asserts the reopened size is (10, 7), and asserts every sampled pixel along the diagonal equals the original constant.
PIL TIFF ImageDescription tag 270 written via description kwarg roundtrips through tag_v2 Port / libtiff / usage-python3-pil-r16-tiff-imagedescription-tag-270-roundtrip Passed
Saves a small RGB TIFF with a fixed description=... kwarg, reopens the file with Pillow, and asserts tag_v2[270] equals the original description string, exercising libtiff's ImageDescription tag write/read path through Pillow.
PIL RGB TIFF surfaces ImageWidth (256) and ImageLength (257) tags matching saved dimensions Port / libtiff / usage-python3-pil-r16-tiff-imagewidth-imagelength-rgb Passed
Saves a 19x13 RGB TIFF with Pillow, reopens with Pillow, asserts tag_v2[256] equals 19 and tag_v2[257] equals 13, and asserts info or the image size matches the same dimensions — exercising libtiff's width/length tags through Pillow's reader.
PIL RGB TIFF saved with tiff_lzw compression roundtrips pixel data exactly Port / libtiff / usage-python3-pil-r16-tiff-lzw-rgb-roundtrip Passed
Builds a 16x16 RGB image with a deterministic gradient, saves it as TIFF with compression='tiff_lzw', reopens with Pillow, asserts the reopened image is RGB sized 16x16, and asserts a sampled corner pixel matches the original byte-for-byte.
PIL save_all append_images writes a 3-frame TIFF readable via seek Port / libtiff / usage-python3-pil-r16-tiff-multiimage-append-three-frames Passed
Saves a TIFF with save_all=True and append_images=[f2, f3], reopens with Pillow, asserts n_frames is 3, seeks to frames 0, 1, and 2 and asserts each frame's mode is L and the per-frame fill colour matches the originals via getpixel((0,0)).
PIL L-mode TIFF saved with packbits compression preserves dimensions and pixels Port / libtiff / usage-python3-pil-r16-tiff-packbits-grayscale-roundtrip Passed
Creates a 12x12 grayscale (L) image with a deterministic ramp, saves as TIFF with compression='packbits', reopens with Pillow, asserts mode L and size 12x12, asserts the pixel at (0,0) and (11,11) match the original values, and asserts info['compression'] is one of the accepted packbits identifiers (string 'packbits' or int 32773).
PIL RGB TIFF reports PhotometricInterpretation tag 262 equal to 2 (RGB) Port / libtiff / usage-python3-pil-r16-tiff-photometric-rgb-equals-2 Passed
Saves a small RGB image as an uncompressed TIFF, reopens with Pillow, asserts tag_v2[262] (PhotometricInterpretation) equals integer 2 — the libtiff identifier for RGB — and asserts the image mode is RGB.
Pillow stripped TIFF re-tiled to 64x64 reports matching tile geometry via tiffinfo Port / libtiff / usage-python3-pil-r16-tiff-tile-geometry-via-tiffinfo Passed
Writes a 128x96 RGB stripped TIFF with Pillow, runs libtiff's tiffcp -t -w 64 -l 64 to produce a tiled variant, and asserts tiffinfo reports both "Tile Width: 64" and "Tile Length: 64", relying on tiffinfo as the authoritative source for tile geometry instead of PIL tag_v2.
Pillow TIFF Artist tag 315 round-trips via tag_v2 Port / libtiff / usage-python3-pil-r17-tiff-artist-tag-roundtrip Passed
Writes a TIFF with the Artist tag (315) set to a fixed string via the tiffinfo kwarg, reopens with Pillow, and asserts tag_v2[315] equals the original string byte-for-byte, confirming libtiff's ASCII tag round-trip via Pillow.
Pillow TIFF Copyright tag 33432 round-trips via tag_v2 Port / libtiff / usage-python3-pil-r17-tiff-copyright-tag-roundtrip Passed
Writes a TIFF with the Copyright tag (33432) set to a fixed string via the tiffinfo kwarg, reopens with Pillow, and asserts tag_v2[33432] equals the original string byte-for-byte, confirming libtiff's ASCII Copyright tag round-trip.
Pillow TIFF ImageWidth (256) and ImageLength (257) tags match the image size on read Port / libtiff / usage-python3-pil-r17-tiff-imagewidth-imagelength-tags Passed
Saves a 17x13 RGB TIFF with Pillow, reopens it, and asserts tag_v2[256] equals 17 and tag_v2[257] equals 13, confirming libtiff round-trips ImageWidth/ImageLength tags consistent with Pillow's reported size.
Pillow grayscale ("L") TIFF round-trips dimensions and mode Port / libtiff / usage-python3-pil-r17-tiff-l-mode-roundtrip-size Passed
Writes an 11x7 grayscale "L" mode TIFF with Pillow, reopens it, asserts the mode is exactly "L" and the size tuple equals (11, 7), confirming libtiff's MinIsBlack grayscale single-sample round-trip via Pillow.
Pillow palette ("P") TIFF round-trips and preserves the P mode on reopen Port / libtiff / usage-python3-pil-r17-tiff-mode-p-palette-roundtrip Passed
Constructs an 8x8 "P" mode palette image, saves it as a TIFF, reopens it with Pillow, and asserts the reopened image mode is exactly "P" with the same width and height, confirming libtiff palette pass-through and Pillow's TIFF palette decoding.
Pillow single-page TIFF reports n_frames == 1 Port / libtiff / usage-python3-pil-r17-tiff-n-frames-single-page Passed
Writes a single-page RGB TIFF, reopens it with Pillow, and asserts the n_frames property equals 1, confirming libtiff's single-directory IFD chain is reported as one frame by Pillow.
Pillow TIFF ResolutionUnit tag 296 is a numeric value in {1,2,3} Port / libtiff / usage-python3-pil-r17-tiff-resolution-unit-tag-integer Passed
Writes an RGB TIFF with default resolution settings, reopens it, asserts tag_v2[296] (ResolutionUnit) is an integer (or castable to one) whose value is in the libtiff-defined set {1=None, 2=Inch, 3=Centimeter}, confirming the tag round-trips as a numeric enum.
Pillow RGBA TIFF preserves a distinct alpha value at the (0,0) corner across round-trip Port / libtiff / usage-python3-pil-r17-tiff-rgba-alpha-corner-roundtrip Passed
Writes a 4x4 RGBA TIFF with the corner pixel (0,0) set to RGBA (10,20,30,40) and the rest opaque white, reopens with Pillow, asserts the reopened mode is "RGBA" and getpixel((0,0)) returns the same (10,20,30,40) tuple, confirming libtiff alpha-plane preservation.
Pillow RGB TIFF reports RowsPerStrip tag 278 as a positive integer Port / libtiff / usage-python3-pil-r17-tiff-rowsperstrip-tag-positive Passed
Saves a 32x32 RGB TIFF, reopens it with Pillow, asserts tag_v2[278] (RowsPerStrip) is castable to a positive integer no greater than the image height (32), confirming libtiff records strip geometry consistent with image dimensions.
Pillow RGB TIFF reports SamplesPerPixel tag 277 equal to 3 Port / libtiff / usage-python3-pil-r17-tiff-samples-per-pixel-rgb-equals-three Passed
Saves a small RGB TIFF with Pillow, reopens it, asserts tag_v2[277] (SamplesPerPixel) equals integer 3 and that the image mode is "RGB", confirming libtiff records three samples per pixel for the RGB photometric interpretation.
Pillow TIFF with compression="tiff_adobe_deflate" round-trips pixel-equal to the original Port / libtiff / usage-python3-pil-r18-tiff-adobe-deflate-compression-roundtrip Passed
Saves a small RGB pattern as a TIFF using compression="tiff_adobe_deflate", reopens it with Pillow, asserts the reopened mode/size match the source, and asserts the decoded bytes are byte-for-byte equal to the original tobytes() result, confirming libtiff Adobe-flavored deflate compression is lossless.
Pillow RGB TIFF reports BitsPerSample tag 258 as three 8-bit values Port / libtiff / usage-python3-pil-r18-tiff-bits-per-sample-rgb-equals-8 Passed
Saves a small RGB TIFF, reopens it with Pillow, asserts tag_v2[258] (BitsPerSample) is an iterable yielding exactly three values each equal to 8, confirming libtiff records 8-bit-per-channel sample depth for the standard RGB photometric.
Pillow TIFF DateTime tag 306 round-trips a fixed timestamp string Port / libtiff / usage-python3-pil-r18-tiff-datetime-tag-roundtrip Passed
Writes an RGB TIFF with the DateTime tag (306) set to the canonical libtiff "YYYY:MM:DD HH:MM:SS" timestamp via tiffinfo, reopens with Pillow, and asserts tag_v2[306] equals the original 19-character timestamp string byte-for-byte.
Pillow getexif() on a TIFF returns an Exif mapping that contains the Software tag Port / libtiff / usage-python3-pil-r18-tiff-getexif-returns-exif-mapping Passed
Writes a TIFF with the Software tag (305) populated via tiffinfo, reopens it with Pillow, calls im.getexif() and asserts the returned object is an instance of PIL.Image.Exif whose mapping contains tag 305 equal to the original string, confirming libtiff EXIF-compatible tag exposure through Pillow's Exif API.
Pillow TIFF im.info dict carries a compression key reflecting save compression Port / libtiff / usage-python3-pil-r18-tiff-info-dict-has-compression-key Passed
Saves an RGB TIFF with compression="tiff_lzw", reopens it with Pillow, asserts im.info is a dict, asserts it contains a "compression" key, and asserts the recorded value equals "tiff_lzw", confirming libtiff-backed compression metadata is exposed through Pillow's per-image info dictionary.
Pillow TIFF save_all with two appended frames produces a 3-page n_frames Port / libtiff / usage-python3-pil-r18-tiff-multiframe-append-three-pages Passed
Writes a multipage TIFF by calling Image.save with save_all=True and an append_images list of two additional frames, reopens the resulting file with Pillow, and asserts im.n_frames equals exactly 3, confirming libtiff multi-page IFD chaining round-trips through Pillow's append API.
Pillow RGB TIFF reports PhotometricInterpretation tag 262 as 2 (RGB) Port / libtiff / usage-python3-pil-r18-tiff-photometric-rgb-equals-2 Passed
Saves an RGB TIFF, reopens it with Pillow, asserts tag_v2[262] (PhotometricInterpretation) is castable to integer 2, which is libtiff's PHOTOMETRIC_RGB constant, confirming the photometric tag is encoded correctly for a standard RGB pixel layout.
Pillow seeks between TIFF frames keeping the same mode and size across pages Port / libtiff / usage-python3-pil-r18-tiff-seek-between-frames-mode-stable Passed
Builds a two-page TIFF where both frames are RGB and 5x5, calls im.seek(0) then im.seek(1) on the reopened file, and asserts both frames report the same mode "RGB" and the same size (5, 5), confirming libtiff IFD navigation preserves per-page metadata reported by Pillow.
Pillow TIFF Software tag 305 round-trips through tag_v2 unchanged Port / libtiff / usage-python3-pil-r18-tiff-software-tag-roundtrip Passed
Writes an RGB TIFF with the Software tag (305) set to a fixed ASCII identifier via a TiffImagePlugin.ImageFileDirectory_v2, reopens with Pillow, and asserts tag_v2[305] equals the original string byte-for-byte, confirming libtiff persists the Software ASCII tag through a save-and-reload cycle.
Pillow TIFF XResolution tag 282 reports a positive rational equivalent to the saved DPI Port / libtiff / usage-python3-pil-r18-tiff-xresolution-tag-rational Passed
Saves a TIFF with dpi=(150, 150), reopens it with Pillow, asserts tag_v2[282] (XResolution) is a libtiff rational castable to a positive float equal to 150.0, and asserts tag_v2[283] (YResolution) is also castable to 150.0, confirming libtiff RATIONAL-typed tag round-trip via Pillow.
Pillow TIFF getexif exposes XResolution tag 282 with a float-castable rational Port / libtiff / usage-python3-pil-r19-tiff-getexif-xresolution-tag-282 Passed
Saves a TIFF with dpi=(200, 200), reopens with Pillow, calls im.getexif() to obtain an Exif object, asserts 282 (XResolution) is a key in the mapping with a value castable to float equal to 200.0, asserts 283 (YResolution) is also present and equals 200.0, and asserts 296 (ResolutionUnit) is in the mapping with integer value 2 (inches), confirming libtiff IFD0 resolution tags surface via getexif.
Pillow TIFF multi-page tell() returns to 0 after seeking back from a later frame Port / libtiff / usage-python3-pil-r19-tiff-multiframe-tell-resets-after-seek-zero Passed
Saves a 4-page TIFF where each page has a distinct fill color, opens the file with Pillow, asserts initial im.tell() is 0, seeks to frame 2 and asserts im.tell() returns 2, then seeks to frame 0 and asserts im.tell() returns 0 again, also asserts the reloaded pixel at (0,0) on frame 0 matches the original red color, confirming libtiff random-access page navigation.
Pillow TIFF NewSubfileType tag 254 absent or zero for a standalone single-image save Port / libtiff / usage-python3-pil-r19-tiff-newsubfiletype-tag-254-zero Passed
Saves a single-image RGB TIFF, reopens with Pillow, and asserts the optional NewSubfileType tag 254 either is missing from tag_v2 or evaluates to integer 0 (no reduced-resolution, page, or mask flags set), confirming libtiff omits or clears the subfile classification on a plain primary image.
Pillow TIFF Orientation tag 274 defaults to 1 (top-left) for a plain RGB save Port / libtiff / usage-python3-pil-r19-tiff-orientation-tag-274-default-topleft Passed
Saves a 4x4 RGB TIFF with no explicit orientation, reopens with Pillow, and asserts tag_v2[274] equals 1 (Orientation TopLeft, the libtiff default) or is absent (interpreted as 1 by the TIFF 6.0 spec); if absent the test additionally asserts im.getexif().get(274, 1) equals 1, confirming the canonical default orientation behavior.
Pillow TIFF saved from L-mode reports PhotometricInterpretation 1 (MinIsBlack) Port / libtiff / usage-python3-pil-r19-tiff-photometric-grayscale-equals-1 Passed
Creates an L-mode (8-bit grayscale) Pillow image filled with value 100, saves as TIFF, reopens and asserts tag_v2[262] (PhotometricInterpretation) equals 1 (MinIsBlack) and asserts tag_v2[258] (BitsPerSample) equals 8 (or the single-element tuple (8,)), confirming libtiff records grayscale photometric metadata correctly.
Pillow TIFF PlanarConfiguration tag 284 defaults to 1 (chunky/interleaved) for an RGB save Port / libtiff / usage-python3-pil-r19-tiff-planarconfig-tag-284-chunky Passed
Saves an RGB TIFF with no explicit planar configuration override, reopens with Pillow, asserts tag_v2[284] equals 1 (chunky, samples interleaved per pixel) which is libtiff's default for RGB, and asserts tag_v2[277] (SamplesPerPixel) equals 3, confirming libtiff writes an interleaved layout for plain RGB data.
Pillow TIFF StripByteCounts tag 279 enumerates positive values for an RGB save Port / libtiff / usage-python3-pil-r19-tiff-stripoffsets-tag-279-list Passed
Saves a 16x16 RGB TIFF, reopens with Pillow, asserts tag_v2[279] (StripByteCounts) is a non-empty tuple of positive integers, asserts sum(tag_v2[279]) is >= width*height*samples (3*16*16=768) which is the uncompressed payload floor, and asserts tag_v2[273] (StripOffsets) has the same number of entries as StripByteCounts, confirming libtiff strip-layout tags are populated and consistent.
libtiff tiffcp -r 2 produces an output TIFF whose RowsPerStrip tag equals 2 Port / libtiff / usage-python3-pil-r19-tiff-tiffcp-strip-rowsperstrip-2 Passed
Generates a 16x16 RGB source TIFF via Pillow, invokes "tiffcp -r 2" to repackage it with two rows per strip, opens the output with Pillow, asserts tag_v2[278] (RowsPerStrip) equals 2, and asserts tag_v2[279] (StripByteCounts) is a tuple of 8 entries (16 rows / 2 rows per strip), confirming libtiff's strip-layout control via the tiffcp CLI.
Pillow TIFF tobytes equals width*height*samples for an RGB save-then-load cycle Port / libtiff / usage-python3-pil-r19-tiff-tobytes-roundtrip-byte-count Passed
Saves a 6x4 RGB TIFF with deterministic pixel data, reopens it, calls im.tobytes() on the reloaded image, asserts its length equals 6*4*3 = 72 bytes (no row padding for raw RGB tobytes), and asserts the reloaded tobytes is identical to the original image's tobytes byte-for-byte, confirming libtiff RGB pixel-data preservation.
Pillow TIFF YResolution tag 283 round-trips an asymmetric dpi value Port / libtiff / usage-python3-pil-r19-tiff-yresolution-tag-rational Passed
Saves an RGB TIFF with dpi=(96, 144) (asymmetric x/y resolution), reopens with Pillow, asserts tag_v2[282] (XResolution) is castable to 96.0 and tag_v2[283] (YResolution) is castable to 144.0, and asserts the two values differ, confirming libtiff persists independent rational X/Y resolution tags through a write+read cycle.
Pillow CMYK TIFF reports four bands and SamplesPerPixel 4 Port / libtiff / usage-python3-pil-r20-tiff-cmyk-mode-four-bands-spp-4 Passed
Saves a 3x3 mode-CMYK TIFF, reopens with Pillow, asserts im.getbands() returns the tuple ('C', 'M', 'Y', 'K'), and asserts the SamplesPerPixel tag 277 reads as 4, confirming libtiff writes four-channel CMYK images with correct band metadata.
Pillow crop on a TIFF reload shrinks dimensions to the requested rect Port / libtiff / usage-python3-pil-r20-tiff-crop-region-changes-size Passed
Saves a 10x10 RGB TIFF via Pillow, reopens, calls .crop((2, 3, 7, 9)), asserts the cropped image has size (5, 6) (width=7-2, height=9-3), and asserts crop().getpixel((0, 0)) equals the parent's getpixel((2, 3)), confirming libtiff-decoded pixel data correctly anchors a PIL crop region.
Pillow-written TIFF file size exceeds the raw pixel byte count Port / libtiff / usage-python3-pil-r20-tiff-filesize-positive-and-nonzero Passed
Saves a 16x16 mode-L TIFF via Pillow and asserts os.path.getsize of the resulting file is strictly greater than 16*16 (the raw pixel byte count) and less than 16384 (an extremely generous upper bound), confirming libtiff encodes recognisable container overhead (header + IFD + tags) around the strip payload.
Pillow TIFF RGB image preserves a non-corner pixel through save and reload Port / libtiff / usage-python3-pil-r20-tiff-getpixel-center-rgb-roundtrip Passed
Builds a 7x7 mode-RGB image filled with black, sets pixel (3, 3) to (171, 82, 199), saves as TIFF, reopens, and asserts r.getpixel((3, 3)) equals (171, 82, 199) exactly, confirming libtiff round-trips a single interior RGB triple losslessly.
Pillow can decode a TIFF directly from an in-memory BytesIO buffer Port / libtiff / usage-python3-pil-r20-tiff-load-from-bytesio-preserves-size Passed
Saves a 6x5 mode-RGB image into a BytesIO via Image.save(buf, format='TIFF'), seeks the buffer to 0, opens it with Image.open(buf), loads, and asserts the resulting size is exactly (6, 5) and mode is 'RGB', confirming libtiff's stream-based decode path handles a non-filesystem reader.
Pillow thumbnail on a TIFF-loaded image fits within the requested bounds Port / libtiff / usage-python3-pil-r20-tiff-thumbnail-fits-within-bounding-box Passed
Saves a 40x20 RGB TIFF, reopens, calls .thumbnail((10, 10)) (modifies in place), and asserts the resulting image's width <= 10 and height <= 10 and that the aspect ratio is preserved (width > height since source aspect 40:20 should produce width:height >= 2:1 after shrink), confirming libtiff-decoded pixels feed Pillow's aspect-preserving thumbnail correctly.
tiffinfo CLI on a Pillow-written TIFF prints Image Width and Image Length lines Port / libtiff / usage-python3-pil-r20-tiff-tiffinfo-prints-image-width-and-length Passed
Saves a 9x7 RGB TIFF via Pillow, runs the tiffinfo CLI on it, and asserts the output contains a line matching "Image Width: 9" and a line matching "Image Length: 7", confirming the libtiff inspection tool reads back the dimensions Pillow wrote.
Pillow TIFF image tobytes length equals width*height for L-mode Port / libtiff / usage-python3-pil-r20-tiff-tobytes-getdata-equal-length Passed
Saves and reopens a 5x6 mode-L TIFF, calls .tobytes() and asserts the length equals 5*6 (30), and calls list(im.getdata()) and asserts its length is also 30, confirming libtiff decodes the strip data back to a contiguous one-byte-per-pixel buffer for grayscale.
Pillow Image.transpose FLIP_LEFT_RIGHT on a TIFF reload mirrors a specific column Port / libtiff / usage-python3-pil-r20-tiff-transpose-flip-left-right-mirrors-pixel Passed
Saves a 6x3 mode-L TIFF, places a unique value at column 0 row 0, reopens, calls .transpose(Image.FLIP_LEFT_RIGHT), and asserts the resulting image getpixel((5, 0)) equals the source's column-0 row-0 value (mirror moves column 0 to column 5 in width=6), confirming libtiff-decoded pixels feed the PIL transpose correctly.
Pillow Image.verify on a freshly-saved TIFF completes without raising Port / libtiff / usage-python3-pil-r20-tiff-verify-on-valid-file-does-not-raise Passed
Saves a 5x5 RGB TIFF via Pillow, opens it again with Image.open, calls .verify() within a try/except block, and asserts no exception was raised, confirming Pillow's libtiff-backed verifier accepts a well-formed TIFF container as valid.
Pillow Image.copy on an opened TIFF preserves size, mode, and pixel value Port / libtiff / usage-python3-pil-r21-tiff-copy-preserves-size-and-mode Passed
Saves a 6x6 mode-L TIFF filled with 77, opens it, calls .copy() and asserts the returned image has identical size, mode, and getpixel((0,0)) value as the original, validating libtiff decode plus Pillow's image clone path.
Pillow getexif on a saved TIFF exposes YResolution at tag id 283 Port / libtiff / usage-python3-pil-r21-tiff-getexif-yresolution-tag-283 Passed
Saves a 5x5 RGB TIFF with dpi=(72, 144), reopens it, calls im.getexif() and asserts tag 283 (YResolution) is present and its rational/numeric value equals 144.0, validating libtiff resolution-tag emission via Pillow's EXIF mapping.
Pillow Image.is_animated is True for a saved 3-page TIFF Port / libtiff / usage-python3-pil-r21-tiff-is-animated-multipage-true Passed
Saves three solid frames as a multipage TIFF using save_all=True, opens it via Image.open, and asserts both Image.n_frames equals 3 and Image.is_animated is True for the multi-page libtiff stream.
Pillow Image.is_animated is False for a single-page TIFF Port / libtiff / usage-python3-pil-r21-tiff-is-animated-single-page-false Passed
Saves a single solid frame as a TIFF (no save_all), opens it via Image.open, and asserts n_frames equals 1 and is_animated is False, confirming the libtiff single-IFD path is correctly reported as non-animated by Pillow.
Pillow load() on a TIFF clears the tile list so a subsequent load() is a no-op Port / libtiff / usage-python3-pil-r21-tiff-load-end-frees-tile-state Passed
Saves a 4x4 mode-L TIFF, opens it, asserts that im.tile is non-empty before load(), then calls load() and asserts im.tile is now empty (decode complete), confirming libtiff strip/tile decode state is consumed exactly once by Pillow.
Pillow mode 1 TIFF default FillOrder tag (266) defaults to MSB2LSB (value 1) Port / libtiff / usage-python3-pil-r21-tiff-mode-1-fillorder-default-tag Passed
Saves an 8x8 mode-1 TIFF (bilevel), opens it via Image.open, and asserts the FillOrder tag (266) is present in tag_v2 and equals 1 (MSB2LSB), validating libtiff's bilevel default fill-order encoding.
Pillow I;16 mode TIFF getextrema returns (min, max) tuple over 16-bit pixel range Port / libtiff / usage-python3-pil-r21-tiff-mode-i16-getextrema-tuple Passed
Constructs an I;16 image from raw little-endian bytes containing the four values 0, 1, 30000, and 65535, saves it as TIFF, reopens, and asserts getextrema() returns exactly (0, 65535), exercising libtiff 16-bit grayscale decoding plus Pillow's per-mode min/max computation.
Pillow TIFF seek past the last frame raises EOFError Port / libtiff / usage-python3-pil-r21-tiff-multipage-seek-past-end-raises Passed
Saves a 2-frame TIFF, opens it, seeks to frame 1, then attempts to seek to frame 2 and asserts an EOFError is raised, validating Pillow's libtiff multipage boundary handling.
Pillow TIFF save round-trip preserves ImageDescription via explicit save kwarg Port / libtiff / usage-python3-pil-r21-tiff-save-with-exif-bytes-roundtrip Passed
Saves a 3x3 RGB TIFF with an explicit description="r21-roundtrip" kwarg, reopens it, and asserts tag 270 (ImageDescription) on tag_v2 equals the supplied string, exercising libtiff string-tag write+read.
Pillow TiffImagePlugin tag_v2 mapping contains BitsPerSample (tag 258) Port / libtiff / usage-python3-pil-r21-tiff-tag-v2-contains-bitspersample Passed
Saves a 7x7 RGB TIFF, opens it, and asserts that 258 (BitsPerSample) is present in im.tag_v2 with a tuple value of three eights, validating libtiff's tag-2-name dictionary surface for the RGB photometric path.
Pillow 1-bit bilevel TIFF roundtrip Port / libtiff / usage-python3-pil-r9-tiff-1bit-bilevel Passed
Saves a Pillow mode 1 (bilevel) image as TIFF and verifies the reopened TIFF reports mode 1 with the expected pixel pattern.
Pillow CMYK TIFF roundtrip Port / libtiff / usage-python3-pil-r9-tiff-cmyk-mode Passed
Creates a CMYK image with Pillow, saves it as TIFF, reopens it, and verifies the pixel mode is CMYK with 4 channels.
Pillow L-mode 8-bit grayscale TIFF roundtrip Port / libtiff / usage-python3-pil-r9-tiff-l-mode-roundtrip Passed
Saves an 8-bit grayscale TIFF via Pillow and verifies all pixel values survive the roundtrip exactly.
Pillow multi-page TIFF n_frames matches save count Port / libtiff / usage-python3-pil-r9-tiff-multipage-frame-count Passed
Saves a 5-frame multi-page TIFF via Pillow append_images and verifies n_frames reports 5 on reopen.
Pillow TIFF resolution tag roundtrip Port / libtiff / usage-python3-pil-r9-tiff-resolution-tag Passed
Saves a TIFF with a 300 dpi resolution tuple via Pillow and verifies the reopened image carries the same resolution metadata.
Pillow RGBA TIFF roundtrip preserves alpha Port / libtiff / usage-python3-pil-r9-tiff-rgba-roundtrip Passed
Saves an RGBA TIFF with a known alpha channel and verifies the reopened TIFF returns the original alpha values pixel-for-pixel.
Pillow rotate 90 TIFF dimensions swap Port / libtiff / usage-python3-pil-r9-tiff-rotate-90-roundtrip Passed
Saves a 12x4 TIFF via Pillow, rotates the reopened image by 90 degrees with expand=True, saves the rotated TIFF, and verifies the dimensions swap to 4x12.
Pillow thumbnail shrinks TIFF below cap Port / libtiff / usage-python3-pil-r9-tiff-thumbnail-shrink Passed
Loads a 80x60 TIFF and applies thumbnail((20, 20)) and verifies both reported dimensions are at most 20.
tiffinfo parses a hand-rolled big-endian TIFF Port / libtiff / usage-python3-pil-r9-tiff-tiffinfo-bigendian Passed
Builds a big-endian TIFF via raw struct serialization and verifies tiffinfo can parse it and report the expected ImageWidth/ImageLength dimensions.
tiffinfo reports Rows/Strip on Pillow output Port / libtiff / usage-python3-pil-r9-tiff-tiffinfo-strip-count Passed
Generates a TIFF via Pillow and verifies tiffinfo prints a Rows/Strip directory entry that matches the image height.
python PIL red channel TIFF Port / libtiff / usage-python3-pil-red-channel-tiff Passed
Pillow nearest resize TIFF Port / libtiff / usage-python3-pil-resize-nearest-tiff Passed
Resizes a TIFF with nearest-neighbor sampling in Pillow and verifies the requested output dimensions.
Pillow resizes TIFF Port / libtiff / usage-python3-pil-resize-tiff Passed
Pillow RGB tiff load Port / libtiff / usage-python3-pil-rgb-tiff-load Passed
Pillow RGBA TIFF Port / libtiff / usage-python3-pil-rgba-tiff Passed
python PIL rotate 180 TIFF Port / libtiff / usage-python3-pil-rotate-180-tiff Passed
Pillow rotates TIFF 270 degrees Port / libtiff / usage-python3-pil-rotate-270-tiff Passed
python PIL rotate expand TIFF Port / libtiff / usage-python3-pil-rotate-expand-tiff Passed
Pillow rotates TIFF Port / libtiff / usage-python3-pil-rotate-tiff Passed
Pillow saves TIFF to memory Port / libtiff / usage-python3-pil-save-memory-tiff Passed
Saves a TIFF into an in-memory buffer with Pillow, reloads it, and verifies the buffered image stays decodable.
Pillow screen mirror TIFF Port / libtiff / usage-python3-pil-screen-mirror-tiff Passed
Uses Pillow ImageChops.screen on a generated TIFF and its mirrored copy and verifies the screened pixel values before round-tripping.
python PIL sequence iterator TIFF Port / libtiff / usage-python3-pil-sequence-iterator-tiff Passed
Pillow splits TIFF bands Port / libtiff / usage-python3-pil-split-bands-tiff Passed
python PIL split merge TIFF Port / libtiff / usage-python3-pil-split-merge-bands-tiff Passed
Pillow split and merge TIFF Port / libtiff / usage-python3-pil-split-merge-tiff Passed
Splits a TIFF into bands with Pillow, merges the bands again, and verifies the result stays decodable.
python PIL stat mean TIFF Port / libtiff / usage-python3-pil-stat-mean-tiff Passed
Pillow subtract mirror TIFF Port / libtiff / usage-python3-pil-subtract-mirror-tiff Passed
Uses Pillow ImageChops.subtract on mirrored and original generated TIFFs and verifies the non-negative channel differences before round-tripping.
Pillow subtract_modulo mirror TIFF Port / libtiff / usage-python3-pil-subtract-modulo-mirror-tiff Passed
Uses Pillow ImageChops.subtract_modulo on a generated TIFF and its mirrored copy and verifies the modular per-channel differences before round-tripping.
Pillow tags tiff Port / libtiff / usage-python3-pil-tags-tiff Passed
Pillow thumbnail tiff Port / libtiff / usage-python3-pil-thumbnail-tiff Passed
Pillow TIFF 16-bit grayscale point doubled Port / libtiff / usage-python3-pil-tiff-16bit-grayscale-point-doubled Passed
Loads an "I;16" TIFF, applies an Image.point lambda x: x*2 mapped through "I" mode to avoid 16-bit overflow, saves the result, and verifies pixels are exactly doubled (capped by I mode width).
Pillow TIFF 16-bit grayscale round-trip Port / libtiff / usage-python3-pil-tiff-16bit-grayscale-roundtrip Passed
Writes an "I;16" 16-bit grayscale TIFF and verifies BitsPerSample=16, SampleFormat, and that pixel bytes round-trip via sha256.
Pillow TIFF 16-bit pixel Port / libtiff / usage-python3-pil-tiff-16bit-pixel-batch11 Passed
Pillow TIFF 72 dpi preserved Port / libtiff / usage-python3-pil-tiff-72dpi-preserved Passed
Saves a TIFF with dpi=(72,72) and verifies that XResolution, YResolution, and the info dpi tuple round-trip correctly.
Pillow TIFF Artist and HostComputer tag round-trip Port / libtiff / usage-python3-pil-tiff-artist-hostcomputer-tags Passed
Saves a TIFF with Artist (315) and HostComputer (316) tags injected via ImageFileDirectory_v2 and verifies both strings reload exactly through Pillow tag_v2 on reopen.
Pillow TIFF endianness magic detection Port / libtiff / usage-python3-pil-tiff-bigtiff-magic-detection Passed
Writes a TIFF with Pillow (little-endian) and a hand-crafted minimal big-endian TIFF, then verifies the II*/MM* magic bytes and that Pillow can detect format on the LE file.
Pillow TIFF bigtiff=True save kwarg accepted and pixel round-trip preserved Port / libtiff / usage-python3-pil-tiff-bigtiff-pillow-kwarg-roundtrip Passed
Saves an RGB TIFF with the Pillow bigtiff=True kwarg, verifies the file begins with one of the legal TIFF magic byte sequences (classic II/MM or BigTIFF II\\x2b/MM\\x2b — Pillow 10.2 may emit either), and asserts the reopened image preserves geometry, mode, and exact pixel bytes against the in-memory original.
Pillow TIFF tiffcp -8 BigTIFF little-endian magic + multipage preserved Port / libtiff / usage-python3-pil-tiff-bigtiff-write-libtiff Passed
Writes a two-page classic little-endian TIFF with Pillow, repackages it as a BigTIFF (-8) via tiffcp without changing byte order, and verifies the II\x00\x2b magic (BigTIFF little-endian), that tiffinfo enumerates two directories with the expected geometries, and that tiffcp -L round-trips the BigTIFF back to a classic TIFF whose pixel buffers match the Pillow originals.
Pillow TIFF BytesIO open Port / libtiff / usage-python3-pil-tiff-bytesio-open-batch11 Passed
Pillow TIFF tiff_ccitt CCITT modified Huffman RLE compression on 1-bit image Port / libtiff / usage-python3-pil-tiff-ccitt-rle-bilevel-compression Passed
Saves a 1-bit (mode "1") bilevel TIFF with compression="tiff_ccitt" (CCITT modified Huffman run-length encoding, Compression tag value 2) and verifies the reopened TIFF reports info["compression"]=="tiff_ccitt", Compression tag (259) equals 2, the mode stays "1", BitsPerSample (258) equals 1, and the bilevel pixel pattern survives the round-trip exactly.
Pillow TIFF Copyright tag round-trip Port / libtiff / usage-python3-pil-tiff-copyright-tag-roundtrip Passed
Saves a TIFF with a Copyright tag (33432) injected via ImageFileDirectory_v2 and verifies the string round-trips through libtiff on reload.
Pillow TIFF DateTime tag round-trip Port / libtiff / usage-python3-pil-tiff-datetime-tag-roundtrip Passed
Saves a TIFF with a DateTime tag (306) in the canonical "YYYY:MM:DD HH:MM:SS" format and verifies the value reads back unchanged via tag_v2.
Pillow TIFF deflate info tag Port / libtiff / usage-python3-pil-tiff-deflate-info-tag Passed
Saves a TIFF with compression=tiff_deflate and verifies the reopened info compression and Compression tag value.
Pillow TIFF description tag Port / libtiff / usage-python3-pil-tiff-description-tag-batch11 Passed
Pillow TIFF DPI info Port / libtiff / usage-python3-pil-tiff-dpi-info-batch11 Passed
Pillow TIFF DPI save Port / libtiff / usage-python3-pil-tiff-dpi-save Passed
Pillow TIFF ImageOps.exif_transpose orientation 6 Port / libtiff / usage-python3-pil-tiff-exif-transpose-orientation Passed
Saves a TIFF with Orientation=6 (rotate 270 CW) tag injected via ImageFileDirectory_v2 and verifies via tiffdump that the tag is encoded into the file, plus that ImageOps.exif_transpose returns a properly-oriented image with the expected dimensions.
Pillow TIFF expand border Port / libtiff / usage-python3-pil-tiff-expand-border-batch11 Passed
Pillow TIFF explicit XResolution rational tag via tiffinfo dict Port / libtiff / usage-python3-pil-tiff-explicit-xresolution-rational Passed
Saves a TIFF with XResolution (282) and YResolution (283) injected as IFDRational(150/1) and (300/1) through a low-level ImageFileDirectory_v2, then verifies tiffinfo prints the resolutions and Pillow exposes the exact rational values.
Pillow TIFF F mode float32 deterministic pixel round-trip Port / libtiff / usage-python3-pil-tiff-f-mode-float32-pixel-roundtrip Passed
Builds an F mode image with deterministic float values, saves it as TIFF, and verifies that BitsPerSample is 32, SampleFormat (339) is IEEE FP (3), and per-pixel float values reload identically via Image.getpixel.
Pillow TIFF bands Port / libtiff / usage-python3-pil-tiff-getbands-batch11 Passed
Pillow TIFF getexif() exposes DateTime tag (306) saved via exif kwarg Port / libtiff / usage-python3-pil-tiff-getexif-datetime-roundtrip Passed
Builds a Pillow Exif object, sets DateTime (306) to a known string, saves an RGB TIFF with exif=exif, reopens the file, and verifies that getexif() returns the DateTime back exactly and that the tag also appears in the top-level tag_v2 dictionary, confirming the EXIF round-trip path works through libtiff.
Pillow TIFF group3 bilevel compression Port / libtiff / usage-python3-pil-tiff-group3-bilevel-compression Passed
Writes a 1-bit TIFF compressed with CCITT Group 3 and verifies the Compression tag is 3 and bilevel pixels round-trip exactly.
Pillow TIFF group4 bilevel compression Port / libtiff / usage-python3-pil-tiff-group4-bilevel-compression Passed
Writes a 1-bit TIFF compressed with CCITT Group 4 and verifies the Compression tag and pixel round-trip.
Pillow TIFF I (int32) mode round-trip with SampleFormat=2 and BitsPerSample=32 Port / libtiff / usage-python3-pil-tiff-i-mode-int32-roundtrip Passed
Saves a Pillow "I" (32-bit signed integer) image to a temporary TIFF and verifies the reopened image preserves the mode, BitsPerSample tag (258) equals 32, SampleFormat tag (339) equals 2 (signed integer), pixel size is preserved, and the raw int32 putpixel value round-trips through getpixel.
Pillow TIFF I;16 little-endian BitsPerSample tag Port / libtiff / usage-python3-pil-tiff-i16-le-bitspersample-tag Passed
Saves an I;16 little-endian grayscale TIFF and verifies BitsPerSample (258) is 16, SamplesPerPixel (277) is 1, and the raw 16-bit pixel buffer round-trips byte-exact through Pillow tobytes.
Pillow TIFF I;16B big-endian round-trip Port / libtiff / usage-python3-pil-tiff-i16b-bigendian-roundtrip Passed
Builds an "I;16B" big-endian 16-bit grayscale image, saves it through libtiff, and verifies the pixels round-trip with BitsPerSample=16 and SamplesPerPixel=1.
Pillow TIFF embedded ICC profile (tag 34675) roundtrip Port / libtiff / usage-python3-pil-tiff-icc-profile-embedded Passed
Writes a TIFF with Pillow embedding a synthetic ICC profile blob via icc_profile, then verifies tiffinfo lists "ICC Profile" and Pillow re-exposes the exact bytes via info["icc_profile"] and tag 34675.
Pillow TIFF image description tag Port / libtiff / usage-python3-pil-tiff-image-description-tag Passed
Saves a TIFF with a custom ImageDescription (tag 270) injected via tiffinfo and verifies the string round-trips on reload.
Pillow TIFF invert L mode Port / libtiff / usage-python3-pil-tiff-invert-l-mode-batch11 Passed
Pillow TIFF JPEG compression info Port / libtiff / usage-python3-pil-tiff-jpeg-compression-info Passed
Writes a JPEG-compressed RGB TIFF and verifies the Compression tag, info dict, and reopened image dimensions.
Pillow TIFF JPEG quality parameter Port / libtiff / usage-python3-pil-tiff-jpeg-quality-save Passed
Writes a JPEG-compressed TIFF with Pillow using the quality parameter and verifies the Compression tag is 7, the file is non-empty, and the reopened image preserves dimensions and mode.
Pillow TIFF LA mode samples round-trip Port / libtiff / usage-python3-pil-tiff-la-mode-samples-roundtrip Passed
Saves a Pillow LA (luminance + alpha) image as TIFF and verifies SamplesPerPixel=2, BitsPerSample=(8,8), and pixel byte round-trip.
Pillow TIFF LZW with predictor round-trip Port / libtiff / usage-python3-pil-tiff-lzw-predictor-roundtrip Passed
Writes an LZW-compressed TIFF with horizontal differencing predictor (317=2) and verifies sha256 byte round-trip plus the Compression tag.
Pillow TIFF Make and Model tag round-trip Port / libtiff / usage-python3-pil-tiff-make-model-tags-roundtrip Passed
Saves a TIFF with Make (271) and Model (272) injected via ImageFileDirectory_v2 tiffinfo and verifies tiffinfo prints both fields and Pillow tag_v2 returns the exact strings on reload.
Pillow TIFF MinSampleValue (280) and MaxSampleValue (281) tags round-trip Port / libtiff / usage-python3-pil-tiff-min-max-sample-value-tags Passed
Saves an L-mode TIFF with explicit MinSampleValue (tag 280) and MaxSampleValue (tag 281) values forwarded through tiffinfo and verifies the reopened image returns both tags - tolerating either scalar or 1-tuple shapes per Pillow tag_v2 conventions - while preserving the pixel mode, BitsPerSample (258) of 8, and image dimensions, demonstrating Pillow forwards SHORT-typed sample-range hints into libtiff and reads them back without coercion.
Pillow TIFF multipage mixed compression via tiffcp Port / libtiff / usage-python3-pil-tiff-multipage-mixed-compression Passed
Writes two single-page RGB TIFFs with Pillow, applies tiffcp -c lzw to page A and tiffcp -c zip to page B, then concatenates them with tiffcp to form a single 2-page TIFF and verifies each frame's Compression tag (259) on reload (5=LZW, 8=Adobe Deflate).
Pillow TIFF multipage save with three differently sized RGB pages Port / libtiff / usage-python3-pil-tiff-multipage-mixed-sizes Passed
Saves a three-page TIFF where each page has a distinct (width, height) and a distinct fill color via save_all+append_images, then walks the frames with seek() and asserts that n_frames is 3, each frame's size matches its expected dimensions in order, each frame stays in mode RGB, and the upper-left pixel of each page returns the expected fill color, demonstrating Pillow propagates per-IFD geometry through libtiff.
Pillow TIFF multi-page seek and tell walk Port / libtiff / usage-python3-pil-tiff-multipage-seek-tell-walk Passed
Writes a 5-page TIFF with distinct flat colors per page and walks frames with seek/tell, checking that each frame's index and dominant color match its position in the sequence.
Pillow TIFF multipage seek third Port / libtiff / usage-python3-pil-tiff-multipage-seek-third-batch11 Passed
Pillow TIFF tiffset Orientation tag value 3 round-trip Port / libtiff / usage-python3-pil-tiff-orientation-tag-bottomright Passed
Saves a TIFF with Pillow, sets the Orientation tag (274) to 3 (rotated 180 / bottom-right) via libtiff's tiffset CLI, and verifies tiffinfo reports "row 0 bottom, col 0 rhs" while Pillow reloads the same RGB pixel buffer (Pillow does not auto-transpose on load).
Pillow TIFF PageName and DocumentName tag round-trip Port / libtiff / usage-python3-pil-tiff-page-name-document-name-tags Passed
Saves a TIFF with DocumentName (269) and PageName (285) injected via ImageFileDirectory_v2 and verifies both strings round-trip through libtiff and reload exactly via Pillow tag_v2.
Pillow TIFF PageNumber tag (297) round-trips a (page, total) pair Port / libtiff / usage-python3-pil-tiff-pagenumber-tag-roundtrip Passed
Writes a single-page TIFF with an explicit PageNumber tag (297) of (0, 1) via tiffinfo and verifies the reopened image returns a length-2 tuple whose first entry is 0 and second is 1, demonstrating Pillow forwards the SHORT[2] tag to libtiff and reads it back without coercion.
Pillow TIFF palette mode emits ColorMap tag (320) of 768 entries Port / libtiff / usage-python3-pil-tiff-palette-colormap-tag Passed
Saves a P-mode TIFF with a ramp palette and verifies the reopened TIFF carries PhotometricInterpretation (262) equal to 3 (palette), a ColorMap tag (320) with exactly 768 16-bit entries (3 channels x 256 colors), BitsPerSample (258) equal to 8, and that the indexed pixel maps back to the expected palette RGB triple.
Pillow TIFF photometric minisblack Port / libtiff / usage-python3-pil-tiff-photometric-minisblack-l Passed
Writes a grayscale TIFF and verifies the PhotometricInterpretation tag equals 1 (minisblack) on reload.
Pillow TIFF photometric miniswhite via tiffcp Port / libtiff / usage-python3-pil-tiff-photometric-miniswhite-bilevel Passed
Builds a 1-bit TIFF with Pillow, converts photometric to MinIsWhite (0) using tiffset, then verifies the PhotometricInterpretation tag (262) reads as 0 on reload via Pillow tag_v2.
Pillow TIFF photometric separated CMYK Port / libtiff / usage-python3-pil-tiff-photometric-separated-cmyk Passed
Writes a CMYK TIFF and verifies PhotometricInterpretation equals 5 (separated) and SamplesPerPixel equals 4.
Pillow TIFF planar configuration via tiffcp Port / libtiff / usage-python3-pil-tiff-planar-configuration-save Passed
Writes an RGB TIFF with Pillow then converts it to planar configuration with tiffcp and verifies the PlanarConfiguration tag and dimensions on reload.
Pillow TIFF predictor deflate round-trip Port / libtiff / usage-python3-pil-tiff-predictor-deflate-roundtrip Passed
Writes a deflate-compressed TIFF with horizontal differencing predictor and verifies sha256 byte round-trip.
Pillow TIFF resolution exact rationals Port / libtiff / usage-python3-pil-tiff-resolution-rationals-exact Passed
Saves a TIFF with dpi=(72,144) and verifies tiffinfo reports XResolution/YResolution lines and PIL exposes the exact rational values via tag_v2.
Pillow TIFF resolution unit centimeter Port / libtiff / usage-python3-pil-tiff-resolution-unit-centimeter Passed
Saves a TIFF with explicit ResolutionUnit=3 (centimeter) via tiffinfo and verifies the tag round-trips.
Pillow TIFF resolution unit inch Port / libtiff / usage-python3-pil-tiff-resolution-unit-inch Passed
Saves a TIFF with dpi=(150,150) and verifies the ResolutionUnit tag (296) is 2 (inch) and XResolution/YResolution round-trip.
Pillow TIFF ResolutionUnit (296) saved as 1 (no absolute unit) Port / libtiff / usage-python3-pil-tiff-resolution-unit-none Passed
Saves a TIFF with explicit ResolutionUnit=1 (no absolute unit, so the X/YResolution rationals describe an aspect ratio only) via tiffinfo and verifies the tag round-trips as 1 while the rationals XResolution (282) and YResolution (283) preserve their ratio after reload.
Pillow TIFF strip byte counts sanity for raw RGB Port / libtiff / usage-python3-pil-tiff-rgb-strip-byte-counts-positive Passed
Saves a 32x16 RGB TIFF with raw (uncompressed) compression and verifies that StripByteCounts (279) sums to width*height*3 = 1536, matching the raw payload size for an 8-bit-per-sample chunky 24-bit TIFF.
Pillow TIFF RGBA ExtraSamples tag (338) marks the alpha channel Port / libtiff / usage-python3-pil-tiff-rgba-extrasamples-tag Passed
Saves a Pillow RGBA TIFF and verifies that on reload SamplesPerPixel (277) equals 4, ExtraSamples (338) is present and contains exactly one entry equal to 2 (unassociated alpha), PhotometricInterpretation (262) equals 2 (RGB), and the constant alpha pixel round-trips byte-for-byte.
Pillow TIFF explicit RowsPerStrip via tiffcp -r repackage Port / libtiff / usage-python3-pil-tiff-rowsperstrip-explicit Passed
Writes a TIFF with Pillow (Pillow does not support multistrip output via the tiffinfo dict; that path raises NotImplementedError), repackages it through tiffcp -r 8 to force RowsPerStrip = 8, and verifies the saved RowsPerStrip tag (278) matches on reload.
Pillow TIFF RowsPerStrip = 16 via tiffcp -r 16 repackage Port / libtiff / usage-python3-pil-tiff-rowsperstrip-tag-tiffcp-r-16 Passed
Writes a 40x80 single-strip TIFF with Pillow (Pillow itself raises NotImplementedError when asked to emit multistrip output, so the layout is forced via tiffcp -r 16 instead) then verifies the repackaged file has Rows/Strip=16, exactly five strips, and Pillow reads back the RowsPerStrip tag (278) as 16.
Pillow TIFF sequence sum Port / libtiff / usage-python3-pil-tiff-sequence-sum-batch11 Passed
Pillow TIFF Software tag round-trip Port / libtiff / usage-python3-pil-tiff-software-tag-roundtrip Passed
Saves a TIFF with a custom Software tag (305) injected via ImageFileDirectory_v2 and verifies the string survives a save/reload cycle through libtiff.
Pillow TIFF strip byte counts via tiffinfo Port / libtiff / usage-python3-pil-tiff-strip-byte-counts-tiffinfo-s Passed
Saves a stripped TIFF with Pillow and verifies the tiffinfo report exposes the per-strip table (rows-per-strip, strip count, and a [offset, byte-count] entry) and that the PIL tag_v2 exposes consistent strip counts.
Pillow TIFF SubIFD tag (330) roundtrip via low-level tag dict Port / libtiff / usage-python3-pil-tiff-subifd-tag-roundtrip Passed
Writes a TIFF whose IFD carries a SubIFD pointer (tag 330) injected through a low-level ImageFileDirectory_v2, then reopens with Pillow and verifies tag 330 is preserved verbatim alongside the standard image tags.
Pillow TIFF three-page save_all Port / libtiff / usage-python3-pil-tiff-three-page-savall Passed
Writes a three-page TIFF with save_all and append_images, then verifies n_frames and per-frame size.
Pillow TIFF tiff2bw grayscale conversion Port / libtiff / usage-python3-pil-tiff-tiff2bw-grayscale Passed
Writes an RGB TIFF with Pillow, converts it to grayscale with tiff2bw, and verifies SamplesPerPixel=1, PhotometricInterpretation=1 and PIL mode L on reload.
Pillow TIFF tiff2bw -R red-only weight Port / libtiff / usage-python3-pil-tiff-tiff2bw-red-only Passed
Writes an RGB TIFF with Pillow whose pixels have a known red channel, runs tiff2bw with -R 100 -G 0 -B 0 (red-only weighting; tiff2bw treats -R/-G/-B as percentages, so 100/0/0 means 100% red contribution), and verifies the resulting grayscale pixel values match the original red channel and PhotometricInterpretation is 1.
Pillow TIFF tiff2pdf -p A4 paper size Port / libtiff / usage-python3-pil-tiff-tiff2pdf-a4-paper Passed
Writes a TIFF with Pillow, converts it to PDF with tiff2pdf -p A4 to set the page size, and verifies the output starts with %PDF- and is non-empty.
Pillow TIFF to PDF via tiff2pdf Port / libtiff / usage-python3-pil-tiff-tiff2pdf-conversion Passed
Writes a TIFF with Pillow, converts it to PDF with tiff2pdf, and verifies the output starts with the %PDF- magic and is a non-empty file.
Pillow TIFF tiffcp big-endian output Port / libtiff / usage-python3-pil-tiff-tiffcp-bigendian-output Passed
Writes a little-endian TIFF with Pillow, runs tiffcp -B to convert it to big-endian byte order, and verifies the MM*.. magic and that Pillow can still decode the resulting file with matching dimensions and mode.
Pillow TIFF tiffcp -8 -B BigTIFF big-endian Port / libtiff / usage-python3-pil-tiff-tiffcp-bigtiff-bigendian Passed
Writes a classic little-endian TIFF with Pillow, repackages it as a BigTIFF (-8) in big-endian byte order (-B) via tiffcp, and verifies the MM..\x2b magic (BigTIFF big-endian) plus that tiffinfo reports the correct geometry. Pillow 10.2.0 on Ubuntu 24.04 cannot decode BigTIFF reliably, so the readback is performed with tiffinfo + libtiff itself rather than Pillow.
Pillow TIFF tiffcp -c none uncompressed Port / libtiff / usage-python3-pil-tiff-tiffcp-c-none-uncompressed Passed
Writes a Deflate-compressed TIFF with Pillow, then converts it with tiffcp -c none and verifies the Compression tag (259) becomes 1 (no compression) and pixel data round-trips byte-for-byte.
Pillow TIFF tiffcp -c packbits Port / libtiff / usage-python3-pil-tiff-tiffcp-c-packbits Passed
Writes an uncompressed TIFF with Pillow, converts it with tiffcp -c packbits, and verifies the Compression tag (259) becomes 32773 (PackBits) and pixel data is preserved.
Pillow TIFF tiffcp -c zip deflate alias Port / libtiff / usage-python3-pil-tiff-tiffcp-c-zip-deflate Passed
Writes an uncompressed TIFF with Pillow, converts it with tiffcp -c zip (the deflate alias), and verifies the Compression tag (259) is 8 (Deflate/Adobe Deflate) and pixels are preserved.
Pillow TIFF tiffcp -c jpeg with rows-per-strip Port / libtiff / usage-python3-pil-tiff-tiffcp-jpeg-rows-per-strip Passed
Writes a stripped TIFF with Pillow, converts it to JPEG-compressed TIFF with tiffcp -c jpeg -r 16, and verifies Compression=7 and RowsPerStrip=16 on reload.
Pillow TIFF tiffcp -c lzw conversion Port / libtiff / usage-python3-pil-tiff-tiffcp-lzw-roundtrip Passed
Writes an uncompressed TIFF with Pillow, converts it to LZW with tiffcp -c lzw, and verifies the Compression tag (259) is 5 and pixel data is preserved.
Pillow TIFF tiffcp -r 32 mid-size strip layout Port / libtiff / usage-python3-pil-tiff-tiffcp-r-32-mid-strip Passed
Writes a 40x100 TIFF with Pillow (single strip), repackages with tiffcp -r 32 to produce four strips (32+32+32+4 rows), and verifies RowsPerStrip = 32 and exactly four strips on the output via tiffinfo -s plus Pillow tag readback.
Pillow TIFF tiffcp 32x32 tile conversion Port / libtiff / usage-python3-pil-tiff-tiffcp-tile-32x32-convert Passed
Writes a stripped TIFF with Pillow then converts it to a 32x32-tiled TIFF with tiffcp -t -w 32 -l 32 and verifies tile geometry via PIL tag_v2 and tiffinfo.
Pillow TIFF strip to tile via tiffcp Port / libtiff / usage-python3-pil-tiff-tiffcp-tile-convert Passed
Writes a stripped TIFF with Pillow then converts it to a tiled TIFF with tiffcp and verifies TileWidth/TileLength via Pillow.
Pillow TIFF tiffcrop -E t top-edge crop Port / libtiff / usage-python3-pil-tiff-tiffcrop-e-top-edge Passed
Writes a 40x100 RGB TIFF with Pillow, runs tiffcrop -E t -m 0,0,80,0 -U px to crop 80 rows off the bottom (origin = top edge), and verifies the cropped output is 40x20 with matching ImageWidth/ImageLength tags via Pillow.
Pillow TIFF tiffcrop -i with two single-page inputs Port / libtiff / usage-python3-pil-tiff-tiffcrop-i-concat-two-inputs Passed
Writes two single-page Pillow TIFFs of identical geometry, runs tiffcrop -i (ignore read errors) with both as sources to produce a single multi-frame output, and verifies the destination opens as a 2-frame TIFF whose per-page solid colors round-trip via Pillow seek().
Pillow TIFF tiffcrop rotate 90 Port / libtiff / usage-python3-pil-tiff-tiffcrop-rotate-90 Passed
Writes a TIFF with Pillow then runs tiffcrop -R 90 and verifies the rotated dimensions and PIL mode on reload.
Pillow TIFF tiffdump key tag inspection Port / libtiff / usage-python3-pil-tiff-tiffdump-key-tags Passed
Writes an RGB TIFF with Pillow, runs tiffdump on it, and asserts the low-level dump reports the expected key directory tags (ImageWidth, ImageLength, BitsPerSample, Photometric, SamplesPerPixel) with the values we wrote.
Pillow TIFF tiffinfo BitsPerSample for 16-bit grayscale Port / libtiff / usage-python3-pil-tiff-tiffinfo-bps-16bit-gray Passed
Writes a 16-bit grayscale (I;16) TIFF with Pillow, runs tiffinfo, and verifies the Bits/Sample line reports 16 and the Photometric Interpretation is the min-is-black grayscale flavour. (tiffinfo only emits a Samples/Pixel line when SamplesPerPixel > 1, so we use Photometric Interpretation as the single-band sanity check instead.)
Pillow TIFF tiffinfo CLI inspect Port / libtiff / usage-python3-pil-tiff-tiffinfo-cli-inspect Passed
Writes a TIFF with Pillow then runs the tiffinfo CLI and verifies key tag lines (ImageWidth, ImageLength, BitsPerSample) appear in the report.
Pillow TIFF tiffinfo -j JPEG tables on JPEG-compressed TIFF Port / libtiff / usage-python3-pil-tiff-tiffinfo-j-jpeg-tables Passed
Writes a JPEG-compressed RGB TIFF with Pillow (compression="jpeg"), runs tiffinfo -j to dump the JPEGTables (tag 347) header, and verifies the report mentions Compression Scheme: JPEG and a non-zero JPEG Tables byte count, and that Pillow exposes Compression=7 plus a non-empty JPEGTables tag.
Pillow TIFF tiffinfo Photometric Interpretation line Port / libtiff / usage-python3-pil-tiff-tiffinfo-photometric-line Passed
Writes an RGB TIFF with Pillow then runs the tiffinfo CLI and verifies the Photometric Interpretation line is reported with the RGB color descriptor.
Pillow TIFF tiffmedian palette reduction Port / libtiff / usage-python3-pil-tiff-tiffmedian-palette-reduce Passed
Writes an RGB TIFF with Pillow, runs tiffmedian -c 16 to produce a palette TIFF, and verifies PhotometricInterpretation=3 (RGB Palette), BitsPerSample=8 and PIL mode P on reload.
Pillow TIFF tiffsplit on 2-page TIFF Port / libtiff / usage-python3-pil-tiff-tiffsplit-2-pages Passed
Writes a minimal 2-page multipage TIFF with Pillow, runs tiffsplit, and verifies exactly two single-frame outputs are produced (page-aaa.tif and page-aab.tif) with the original per-page solid colors preserved.
Pillow TIFF tiffsplit on 5-page TIFF Port / libtiff / usage-python3-pil-tiff-tiffsplit-five-pages Passed
Writes a 5-page TIFF with Pillow, runs tiffsplit to produce 5 single-page files, and verifies each output has exactly one frame and the dominant color matches the source page index.
Pillow TIFF tiffsplit multipage split Port / libtiff / usage-python3-pil-tiff-tiffsplit-multipage Passed
Writes a 3-page TIFF with Pillow, runs tiffsplit to split it, and verifies that 3 single-page output files are produced with expected name pattern and each contains exactly one frame.
Pillow TIFF tiffsplit on a single-page input (degenerate) Port / libtiff / usage-python3-pil-tiff-tiffsplit-single-page-degenerate Passed
Writes a one-page TIFF with Pillow, runs tiffsplit, and verifies the degenerate case: exactly one output file (page-aaa.tif) is produced, no page-aab.tif appears, and the lone fragment round-trips through Pillow with size, mode, and solid-color pixel preserved.
Pillow TIFF tiled layout tile width and length tags Port / libtiff / usage-python3-pil-tiff-tile-width-length-tags Passed
Pillow saves a stripped TIFF, tiffcp repackages it as 32x32 tiles, and Pillow reload exposes tag_v2 TileWidth (322) and TileLength (323) both equal to 32 plus consistent TileOffsets and TileByteCounts arrays.
Pillow TIFF to BMP Port / libtiff / usage-python3-pil-tiff-to-bmp Passed
Pillow TIFF to JPEG Port / libtiff / usage-python3-pil-tiff-to-jpeg Passed
Pillow TIFF to PNG Port / libtiff / usage-python3-pil-tiff-to-png Passed
Pillow TIFF tobytes length Port / libtiff / usage-python3-pil-tiff-tobytes-length-batch11 Passed
Pillow transposes TIFF Port / libtiff / usage-python3-pil-transpose-tiff Passed
Pillow transverse generated TIFF Port / libtiff / usage-python3-pil-transverse-generated-tiff Passed
Applies Pillow transverse transpose to a generated TIFF and verifies both the swapped dimensions and mapped corner pixels before round-tripping.
Pillow uncompressed TIFF Port / libtiff / usage-python3-pil-uncompressed-tiff Passed
CVE-2004-0804 libtiff regression Port / libtiff / cve-2004-0804 Passed
Asserts that tiffinfo rejects a TIFF with zero ImageLength without dividing by it inside tif_dirread row-bytes arithmetic.
CVE-2005-2452 libtiff regression Port / libtiff / cve-2005-2452 Passed
Asserts that tiffinfo rejects a YCbCr TIFF whose YCbCrSubSampling tag declares zero horizontal/vertical sampling without dividing by zero in strip-size arithmetic.
CVE-2006-3463 libtiff regression Port / libtiff / cve-2006-3463 Passed
Asserts that EstimateStripByteCounts terminates in bounded time when the StripOffsets/StripByteCounts arrays declare a 32-bit strip count that previously overflowed a 16-bit loop counter.
CVE-2014-8130 libtiff regression Port / libtiff / cve-2014-8130 Passed
Asserts that libtiff rejects a TIFF declaring zero BitsPerSample without producing a divide-by-zero exception inside scanline-size arithmetic.
CVE-2017-11613 libtiff regression Port / libtiff / cve-2017-11613 Passed
Asserts that TIFFOpen rejects a directory whose ImageLength would drive ChopUpSingleUncompressedStrip to request enormous allocations, without crashing or hanging.
CVE-2018-5784 libtiff regression Port / libtiff / cve-2018-5784 Passed
Asserts that TIFFSetDirectory rejects a directory whose declared entry count is far larger than the file actually contains, without entering an unbounded allocation or read loop.
CVE-2019-14973 libtiff regression Port / libtiff / cve-2019-14973 Passed
Asserts that _TIFFCheckMalloc rejects a request whose size arithmetic would have relied on undefined signed-overflow behaviour, surfacing a clean error rather than producing the multiplication-wrap allocation.
CVE-2022-40090 libtiff regression Port / libtiff / cve-2022-40090 Passed
Asserts that TIFFReadDirectory terminates in bounded time on a TIFF whose IFD chain points back to itself, instead of looping forever through repeated directory offsets.
CVE-2023-52355 libtiff regression Port / libtiff / cve-2023-52355 Passed
Asserts that TIFFRasterScanlineSize64 rejects an ImageWidth that would overflow scanline-size arithmetic instead of producing the impractically large allocation request.
CVE-2023-6277 libtiff regression Port / libtiff / cve-2023-6277 Passed
Asserts that TIFFOpen rejects a tiny crafted TIFF whose declared dimensions would otherwise drive an out-of-memory allocation pattern, in bounded time.