mirror of
https://github.com/python-pillow/Pillow.git
synced 2024-11-14 05:36:48 +03:00
Merge pull request #7965 from Yay295/patch-3
This commit is contained in:
commit
c6d8c58b6d
Binary file not shown.
Before Width: | Height: | Size: 378 B After Width: | Height: | Size: 414 B |
BIN
Tests/images/rgba16.tga
Normal file
BIN
Tests/images/rgba16.tga
Normal file
Binary file not shown.
After Width: | Height: | Size: 48 B |
|
@ -72,12 +72,21 @@ def test_palette_depth_8(tmp_path: Path) -> None:
|
||||||
|
|
||||||
def test_palette_depth_16(tmp_path: Path) -> None:
|
def test_palette_depth_16(tmp_path: Path) -> None:
|
||||||
with Image.open("Tests/images/p_16.tga") as im:
|
with Image.open("Tests/images/p_16.tga") as im:
|
||||||
assert_image_equal_tofile(im.convert("RGB"), "Tests/images/p_16.png")
|
assert im.palette.mode == "RGBA"
|
||||||
|
assert_image_equal_tofile(im.convert("RGBA"), "Tests/images/p_16.png")
|
||||||
|
|
||||||
out = str(tmp_path / "temp.png")
|
out = str(tmp_path / "temp.png")
|
||||||
im.save(out)
|
im.save(out)
|
||||||
with Image.open(out) as reloaded:
|
with Image.open(out) as reloaded:
|
||||||
assert_image_equal_tofile(reloaded.convert("RGB"), "Tests/images/p_16.png")
|
assert_image_equal_tofile(reloaded.convert("RGBA"), "Tests/images/p_16.png")
|
||||||
|
|
||||||
|
|
||||||
|
def test_rgba_16() -> None:
|
||||||
|
with Image.open("Tests/images/rgba16.tga") as im:
|
||||||
|
assert im.mode == "RGBA"
|
||||||
|
|
||||||
|
assert im.getpixel((0, 0)) == (172, 0, 255, 255)
|
||||||
|
assert im.getpixel((1, 0)) == (0, 255, 82, 0)
|
||||||
|
|
||||||
|
|
||||||
def test_id_field() -> None:
|
def test_id_field() -> None:
|
||||||
|
|
|
@ -36,7 +36,7 @@ MODES = {
|
||||||
(3, 1): "1",
|
(3, 1): "1",
|
||||||
(3, 8): "L",
|
(3, 8): "L",
|
||||||
(3, 16): "LA",
|
(3, 16): "LA",
|
||||||
(2, 16): "BGR;5",
|
(2, 16): "BGRA;15Z",
|
||||||
(2, 24): "BGR",
|
(2, 24): "BGR",
|
||||||
(2, 32): "BGRA",
|
(2, 32): "BGRA",
|
||||||
}
|
}
|
||||||
|
@ -87,9 +87,7 @@ class TgaImageFile(ImageFile.ImageFile):
|
||||||
elif imagetype in (1, 9):
|
elif imagetype in (1, 9):
|
||||||
self._mode = "P" if colormaptype else "L"
|
self._mode = "P" if colormaptype else "L"
|
||||||
elif imagetype in (2, 10):
|
elif imagetype in (2, 10):
|
||||||
self._mode = "RGB"
|
self._mode = "RGB" if depth == 24 else "RGBA"
|
||||||
if depth == 32:
|
|
||||||
self._mode = "RGBA"
|
|
||||||
else:
|
else:
|
||||||
msg = "unknown TGA mode"
|
msg = "unknown TGA mode"
|
||||||
raise SyntaxError(msg)
|
raise SyntaxError(msg)
|
||||||
|
@ -118,15 +116,16 @@ class TgaImageFile(ImageFile.ImageFile):
|
||||||
start, size, mapdepth = i16(s, 3), i16(s, 5), s[7]
|
start, size, mapdepth = i16(s, 3), i16(s, 5), s[7]
|
||||||
if mapdepth == 16:
|
if mapdepth == 16:
|
||||||
self.palette = ImagePalette.raw(
|
self.palette = ImagePalette.raw(
|
||||||
"BGR;15", b"\0" * 2 * start + self.fp.read(2 * size)
|
"BGRA;15Z", bytes(2 * start) + self.fp.read(2 * size)
|
||||||
)
|
)
|
||||||
|
self.palette.mode = "RGBA"
|
||||||
elif mapdepth == 24:
|
elif mapdepth == 24:
|
||||||
self.palette = ImagePalette.raw(
|
self.palette = ImagePalette.raw(
|
||||||
"BGR", b"\0" * 3 * start + self.fp.read(3 * size)
|
"BGR", bytes(3 * start) + self.fp.read(3 * size)
|
||||||
)
|
)
|
||||||
elif mapdepth == 32:
|
elif mapdepth == 32:
|
||||||
self.palette = ImagePalette.raw(
|
self.palette = ImagePalette.raw(
|
||||||
"BGRA", b"\0" * 4 * start + self.fp.read(4 * size)
|
"BGRA", bytes(4 * start) + self.fp.read(4 * size)
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
msg = "unknown TGA map depth"
|
msg = "unknown TGA map depth"
|
||||||
|
|
|
@ -718,6 +718,21 @@ ImagingUnpackBGRA15(UINT8 *out, const UINT8 *in, int pixels) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ImagingUnpackBGRA15Z(UINT8 *out, const UINT8 *in, int pixels) {
|
||||||
|
int i, pixel;
|
||||||
|
/* RGB, rearranged channels, 5/5/5/1 bits per pixel, inverted alpha */
|
||||||
|
for (i = 0; i < pixels; i++) {
|
||||||
|
pixel = in[0] + (in[1] << 8);
|
||||||
|
out[B] = (pixel & 31) * 255 / 31;
|
||||||
|
out[G] = ((pixel >> 5) & 31) * 255 / 31;
|
||||||
|
out[R] = ((pixel >> 10) & 31) * 255 / 31;
|
||||||
|
out[A] = ~((pixel >> 15) * 255);
|
||||||
|
out += 4;
|
||||||
|
in += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ImagingUnpackRGB16(UINT8 *out, const UINT8 *in, int pixels) {
|
ImagingUnpackRGB16(UINT8 *out, const UINT8 *in, int pixels) {
|
||||||
int i, pixel;
|
int i, pixel;
|
||||||
|
@ -1538,7 +1553,7 @@ static struct {
|
||||||
|
|
||||||
/* flags: "I" inverted data; "R" reversed bit order; "B" big
|
/* flags: "I" inverted data; "R" reversed bit order; "B" big
|
||||||
endian byte order (default is little endian); "L" line
|
endian byte order (default is little endian); "L" line
|
||||||
interleave, "S" signed, "F" floating point */
|
interleave, "S" signed, "F" floating point, "Z" inverted alpha */
|
||||||
|
|
||||||
/* exception: rawmodes "I" and "F" are always native endian byte order */
|
/* exception: rawmodes "I" and "F" are always native endian byte order */
|
||||||
|
|
||||||
|
@ -1646,6 +1661,7 @@ static struct {
|
||||||
{"RGBA", "RGBA;L", 32, unpackRGBAL},
|
{"RGBA", "RGBA;L", 32, unpackRGBAL},
|
||||||
{"RGBA", "RGBA;15", 16, ImagingUnpackRGBA15},
|
{"RGBA", "RGBA;15", 16, ImagingUnpackRGBA15},
|
||||||
{"RGBA", "BGRA;15", 16, ImagingUnpackBGRA15},
|
{"RGBA", "BGRA;15", 16, ImagingUnpackBGRA15},
|
||||||
|
{"RGBA", "BGRA;15Z", 16, ImagingUnpackBGRA15Z},
|
||||||
{"RGBA", "RGBA;4B", 16, ImagingUnpackRGBA4B},
|
{"RGBA", "RGBA;4B", 16, ImagingUnpackRGBA4B},
|
||||||
{"RGBA", "RGBA;16L", 64, unpackRGBA16L},
|
{"RGBA", "RGBA;16L", 64, unpackRGBA16L},
|
||||||
{"RGBA", "RGBA;16B", 64, unpackRGBA16B},
|
{"RGBA", "RGBA;16B", 64, unpackRGBA16B},
|
||||||
|
|
Loading…
Reference in New Issue
Block a user