-
-
Notifications
You must be signed in to change notification settings - Fork 2.4k
Description
While investigating an ImageIO issue concerning behavior on big-endian architectures I've noticed that pillow's PNG plugin currently doesn't allow writing 16-bit big-endian images to PNG. I;16 is already supported, so I was wondering if it would be possible to add I;16B as well.
From what I can see, the only change needed to support this would be to add the line "I;16B": ("I;16B", b"\x10\x00"), to this dict:
Pillow/src/PIL/PngImagePlugin.py
Lines 1035 to 1051 in 3c5324b
| _OUTMODES = { | |
| # supported PIL modes, and corresponding rawmodes/bits/color combinations | |
| "1": ("1", b"\x01\x00"), | |
| "L;1": ("L;1", b"\x01\x00"), | |
| "L;2": ("L;2", b"\x02\x00"), | |
| "L;4": ("L;4", b"\x04\x00"), | |
| "L": ("L", b"\x08\x00"), | |
| "LA": ("LA", b"\x08\x04"), | |
| "I": ("I;16B", b"\x10\x00"), | |
| "I;16": ("I;16B", b"\x10\x00"), | |
| "P;1": ("P;1", b"\x01\x03"), | |
| "P;2": ("P;2", b"\x02\x03"), | |
| "P;4": ("P;4", b"\x04\x03"), | |
| "P": ("P", b"\x08\x03"), | |
| "RGB": ("RGB", b"\x08\x02"), | |
| "RGBA": ("RGBA", b"\x08\x06"), | |
| } |
With this change we would be able to do 16 bit round-trips on big-endian, i.e., we can decode the pixel data directly into a 16 bit big-endian buffer and then use that same buffer when encoding as PNG. This would improve performance and streamline working with native encoding on big-endian machines.