CodeSampleX

샘플

pillow 12.3.0: Normalize EXIF orientation with Pillow 12.3.0 without mistaking the in-place API's None return for the transformed image.

검증된 샘플 — pypi pillow 12.3.0: Normalize EXIF orientation with Pillow 12.3.0 without mistaking the in-place API's None return for the transformed image. python…

sha256:1a0c77d1acd1df6aa566ef5dd18ab1b8a9b9245b1e7c6e853fd1c0d339f895e6

이 네트워크가 제공하는 것은 하나입니다. 빌드되는 샘플. 샌드박스에서 돌리고 서명된 영수증을 보관합니다. 등급을 매기지 않고 무엇도 보증하지 않습니다 — 같은 코드가 당신 환경에서 빌드되는지는 측정한 적이 없습니다. 통과한 계약 영수증을 낸 서로 다른 서명 키의 수입니다. 하나면 작성자 혼자이고, 둘 이상이면 다른 사람도 빌드했다는 뜻입니다. 키는 스스로 만드는 것이고 뒤에 등록된 신원이 없으므로, 세는 것은 사람이 아니라 키입니다. MIT-0

실행 증거

선언된 환경과 서명된 실행을 분리해 두었습니다. 이 샘플이 무엇을 어디서 실행했는지 그대로 볼 수 있습니다.

증거 기준
서명된 컨트랙트 통과
검증 영수증
2
빌드한 서명 키
2
선언된 환경 python linux x64 python python pip

검증 실행 환경

환경 컨트랙트 단계 실행일
python 3.12 · linux alpine/x64 · docker ed25519:d91480838ac982c9 PASS compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS
CONTAINER_RUN · python@1
2026-08-17
python 3.12 · linux alpine/x64 · docker ed25519:2175b912ea1c23b1 PASS compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS
CONTAINER_RUN · python@1
2026-08-18

케이스

HOW
목표
Normalize EXIF orientation with Pillow 12.3.0 without mistaking the in-place API's None return for the transformed image.
패키지
심벌
  • PIL.Image.new
  • PIL.Image.Exif
  • PIL.ImageOps.exif_transpose
  • PIL.ExifTags.Base.Orientation
  • PIL.Image.Transpose.ROTATE_270
환경
python
생성일
2026-08-17T02:14:46Z

컨트랙트

  1. The default ImageOps.exif_transpose call returns a distinct transformed copy, removes EXIF Orientation from the copy, and leaves the source image unchanged.
  2. ImageOps.exif_transpose(..., in_place=True) mutates the source pixels and dimensions, removes EXIF Orientation, and returns None rather than the image.
  3. The in_place parameter is keyword-only; passing it positionally raises TypeError.
  4. EXIF Orientation 6 maps a 3-by-2 image to a 2-by-3 clockwise rotation with deterministic pixel order.

파일

  • NOTES.md
  • csx.json
  • requirements.lock
  • requirements.txt
  • test/contract.py

소스 아티팩트 내려받기 (tar.gz)

소스

NOTES.md
# Pillow EXIF transpose contract

`ImageOps.exif_transpose` has two deliberately different ownership modes. The
default call returns a new image, while `in_place=True` mutates the input and
returns `None`. In both modes, a handled EXIF Orientation value is removed so
that downstream software does not rotate the pixels a second time.

This contract builds an RGB image and its EXIF bytes entirely in memory. Using
Orientation 6 makes both the dimension swap and the exact clockwise pixel
mapping observable without filesystem fixtures or lossy JPEG encoding.
csx.json
{"case":{"believed":"ImageOps.exif_transpose always returns the transformed image and accepts in_place as a positional argument.","caseId":"case:sha256:f1f2db3e57984b0c6f1fbaf071d1e0f3df0f53aec6de21c1c4147004426161eb","contract":["The default ImageOps.exif_transpose call returns a distinct transformed copy, removes EXIF Orientation from the copy, and leaves the source image unchanged.","ImageOps.exif_transpose(..., in_place=True) mutates the source pixels and dimensions, removes EXIF Orientation, and returns None rather than the image.","The in_place parameter is keyword-only; passing it positionally raises TypeError.","EXIF Orientation 6 maps a 3-by-2 image to a 2-by-3 clockwise rotation with deterministic pixel order."],"goal":"Normalize EXIF orientation with Pillow 12.3.0 without mistaking the in-place API's None return for the transformed image.","kind":"HOW","packages":["pkg:pypi/pillow@12.3.0"],"schemaVersion":1,"symbols":["PIL.Image.new","PIL.Image.Exif","PIL.ImageOps.exif_transpose","PIL.ExifTags.Base.Orientation","PIL.Image.Transpose.ROTATE_270"]},"contractCommand":["python","test/contract.py"],"environment":{"arch":"x64","ecosystem":"pypi","executionContext":"python","language":"python","os":"linux","packageManager":"pip","runtime":"python","schemaVersion":1},"license":"MIT-0","packages":["pkg:pypi/pillow@12.3.0"],"schemaVersion":1,"symbols":["PIL.Image.new","PIL.Image.Exif","PIL.ImageOps.exif_transpose","PIL.ExifTags.Base.Orientation","PIL.Image.Transpose.ROTATE_270"],"verifierAdapter":"python@1"}
requirements.lock
Pillow==12.3.0
requirements.txt
Pillow==12.3.0
test/contract.py
import unittest

import PIL
from PIL import ExifTags, Image, ImageOps


ORIENTATION = ExifTags.Base.Orientation
SOURCE_PIXELS = [
    (1, 0, 0),
    (2, 0, 0),
    (3, 0, 0),
    (4, 0, 0),
    (5, 0, 0),
    (6, 0, 0),
]
ROTATED_PIXELS = [
    (4, 0, 0),
    (1, 0, 0),
    (5, 0, 0),
    (2, 0, 0),
    (6, 0, 0),
    (3, 0, 0),
]


def oriented_image() -> Image.Image:
    image = Image.new("RGB", (3, 2))
    image.putdata(SOURCE_PIXELS)
    exif = Image.Exif()
    exif[ORIENTATION] = 6
    image.info["exif"] = exif.tobytes()
    return image


class ExifTransposeContract(unittest.TestCase):
    def test_contract_runs_against_exact_pillow_release(self) -> None:
        self.assertEqual(PIL.__version__, "12.3.0")
        self.assertTrue(Image.core.__file__.endswith((".so", ".pyd")))

    def test_default_returns_normalized_copy_and_preserves_source(self) -> None:
        source = oriented_image()

        normalized = ImageOps.exif_transpose(source)

        self.assertIsNot(normalized, source)
        self.assertEqual(normalized.size, (2, 3))
        self.assertEqual(list(normalized.getdata()), ROTATED_PIXELS)
        self.assertNotIn(ORIENTATION, normalized.getexif())
        self.assertEqual(source.size, (3, 2))
        self.assertEqual(list(source.getdata()), SOURCE_PIXELS)
        self.assertEqual(source.getexif()[ORIENTATION], 6)

    def test_in_place_mutates_source_and_returns_none(self) -> None:
        source = oriented_image()

        result = ImageOps.exif_transpose(source, in_place=True)

        self.assertIsNone(result)
        self.assertEqual(source.size, (2, 3))
        self.assertEqual(list(source.getdata()), ROTATED_PIXELS)
        self.assertNotIn(ORIENTATION, source.getexif())

    def test_in_place_is_keyword_only(self) -> None:
        with self.assertRaises(TypeError):
            ImageOps.exif_transpose(oriented_image(), True)  # type: ignore[misc]


if __name__ == "__main__":
    unittest.main()

오리진 시더

csx-seed