This commit is contained in:
Andrew Murray 2025-10-27 13:20:09 +00:00 committed by GitHub
commit 650dfd2850
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 38 additions and 12 deletions

View File

@ -355,6 +355,35 @@ class TestFileLibTiff(LibTiffTestCase):
# Should not segfault # Should not segfault
im.save(outfile) im.save(outfile)
@pytest.mark.parametrize("tagtype", (TiffTags.SIGNED_RATIONAL, TiffTags.IFD))
def test_tag_type(
self, tagtype: int, monkeypatch: pytest.MonkeyPatch, tmp_path: Path
) -> None:
monkeypatch.setattr(TiffImagePlugin, "WRITE_LIBTIFF", True)
ifd = TiffImagePlugin.ImageFileDirectory_v2()
ifd[37000] = 100
ifd.tagtype[37000] = tagtype
out = tmp_path / "temp.tif"
im = Image.new("L", (1, 1))
im.save(out, tiffinfo=ifd)
with Image.open(out) as reloaded:
assert reloaded.tag_v2[37000] == 100
def test_inknames_tag(
self, monkeypatch: pytest.MonkeyPatch, tmp_path: Path
) -> None:
monkeypatch.setattr(TiffImagePlugin, "WRITE_LIBTIFF", True)
out = tmp_path / "temp.tif"
hopper("L").save(out, tiffinfo={333: "name\x00"})
with Image.open(out) as reloaded:
assert isinstance(reloaded, TiffImagePlugin.TiffImageFile)
assert reloaded.tag_v2[333] in ("name", "name\x00")
def test_whitepoint_tag( def test_whitepoint_tag(
self, monkeypatch: pytest.MonkeyPatch, tmp_path: Path self, monkeypatch: pytest.MonkeyPatch, tmp_path: Path
) -> None: ) -> None:

View File

@ -558,7 +558,6 @@ LIBTIFF_CORE = {
LIBTIFF_CORE.remove(255) # We don't have support for subfiletypes LIBTIFF_CORE.remove(255) # We don't have support for subfiletypes
LIBTIFF_CORE.remove(322) # We don't have support for writing tiled images with libtiff LIBTIFF_CORE.remove(322) # We don't have support for writing tiled images with libtiff
LIBTIFF_CORE.remove(323) # Tiled images LIBTIFF_CORE.remove(323) # Tiled images
LIBTIFF_CORE.remove(333) # Ink Names either
# Note to advanced users: There may be combinations of these # Note to advanced users: There may be combinations of these
# parameters and values that when added properly, will work and # parameters and values that when added properly, will work and

View File

@ -668,10 +668,10 @@ PyImaging_LibTiffEncoderNew(PyObject *self, PyObject *args) {
int key_int, status, is_core_tag, is_var_length, num_core_tags, i; int key_int, status, is_core_tag, is_var_length, num_core_tags, i;
TIFFDataType type = TIFF_NOTYPE; TIFFDataType type = TIFF_NOTYPE;
// This list also exists in TiffTags.py // This list also exists in TiffTags.py
const int core_tags[] = {256, 257, 258, 259, 262, 263, 266, 269, 274, const int core_tags[] = {256, 257, 258, 259, 262, 263, 266, 269, 274, 277,
277, 278, 280, 281, 340, 341, 282, 283, 284, 278, 280, 281, 282, 283, 284, 286, 287, 296, 297,
286, 287, 296, 297, 320, 321, 338, 32995, 32998, 301, 320, 321, 330, 333, 338, 339, 340, 341, 530,
32996, 339, 32997, 330, 531, 530, 65537, 301, 532}; 531, 532, 32995, 32996, 32997, 32998, 65537};
Py_ssize_t tags_size; Py_ssize_t tags_size;
PyObject *item; PyObject *item;
@ -821,7 +821,8 @@ PyImaging_LibTiffEncoderNew(PyObject *self, PyObject *args) {
} }
} }
if (type == TIFF_BYTE || type == TIFF_UNDEFINED) { if (type == TIFF_BYTE || type == TIFF_UNDEFINED ||
key_int == TIFFTAG_INKNAMES) {
status = ImagingLibTiffSetField( status = ImagingLibTiffSetField(
&encoder->state, &encoder->state,
(ttag_t)key_int, (ttag_t)key_int,
@ -973,7 +974,7 @@ PyImaging_LibTiffEncoderNew(PyObject *self, PyObject *args) {
status = ImagingLibTiffSetField( status = ImagingLibTiffSetField(
&encoder->state, (ttag_t)key_int, (UINT16)PyLong_AsLong(value) &encoder->state, (ttag_t)key_int, (UINT16)PyLong_AsLong(value)
); );
} else if (type == TIFF_LONG) { } else if (type == TIFF_LONG || type == TIFF_IFD) {
status = ImagingLibTiffSetField( status = ImagingLibTiffSetField(
&encoder->state, (ttag_t)key_int, (UINT32)PyLong_AsLong(value) &encoder->state, (ttag_t)key_int, (UINT32)PyLong_AsLong(value)
); );
@ -989,10 +990,6 @@ PyImaging_LibTiffEncoderNew(PyObject *self, PyObject *args) {
status = ImagingLibTiffSetField( status = ImagingLibTiffSetField(
&encoder->state, (ttag_t)key_int, (FLOAT32)PyFloat_AsDouble(value) &encoder->state, (ttag_t)key_int, (FLOAT32)PyFloat_AsDouble(value)
); );
} else if (type == TIFF_DOUBLE) {
status = ImagingLibTiffSetField(
&encoder->state, (ttag_t)key_int, (FLOAT64)PyFloat_AsDouble(value)
);
} else if (type == TIFF_SBYTE) { } else if (type == TIFF_SBYTE) {
status = ImagingLibTiffSetField( status = ImagingLibTiffSetField(
&encoder->state, (ttag_t)key_int, (INT8)PyLong_AsLong(value) &encoder->state, (ttag_t)key_int, (INT8)PyLong_AsLong(value)
@ -1001,7 +998,8 @@ PyImaging_LibTiffEncoderNew(PyObject *self, PyObject *args) {
status = ImagingLibTiffSetField( status = ImagingLibTiffSetField(
&encoder->state, (ttag_t)key_int, PyBytes_AsString(value) &encoder->state, (ttag_t)key_int, PyBytes_AsString(value)
); );
} else if (type == TIFF_RATIONAL) { } else if (type == TIFF_DOUBLE || type == TIFF_SRATIONAL ||
type == TIFF_RATIONAL) {
status = ImagingLibTiffSetField( status = ImagingLibTiffSetField(
&encoder->state, (ttag_t)key_int, (FLOAT64)PyFloat_AsDouble(value) &encoder->state, (ttag_t)key_int, (FLOAT64)PyFloat_AsDouble(value)
); );