Skip to content

Commit 7ecb5aa

Browse files
committed
BYTE tags of variable length are only single strings
1 parent 794e9f0 commit 7ecb5aa

3 files changed

Lines changed: 17 additions & 23 deletions

File tree

Tests/test_file_tiff_metadata.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -319,13 +319,13 @@ def test_empty_values():
319319

320320
def test_PhotoshopInfo(tmp_path):
321321
with Image.open("Tests/images/issue_2278.tif") as im:
322-
assert len(im.tag_v2[34377]) == 1
323-
assert isinstance(im.tag_v2[34377][0], bytes)
322+
assert len(im.tag_v2[34377]) == 70
323+
assert isinstance(im.tag_v2[34377], bytes)
324324
out = str(tmp_path / "temp.tiff")
325325
im.save(out)
326326
with Image.open(out) as reloaded:
327-
assert len(reloaded.tag_v2[34377]) == 1
328-
assert isinstance(reloaded.tag_v2[34377][0], bytes)
327+
assert len(reloaded.tag_v2[34377]) == 70
328+
assert isinstance(reloaded.tag_v2[34377], bytes)
329329

330330

331331
def test_too_many_entries():

src/PIL/TiffImagePlugin.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -573,8 +573,10 @@ def _setitem(self, tag, value, legacy_api):
573573
# Spec'd length == 1, Actual > 1, Warn and truncate. Formerly barfed.
574574
# No Spec, Actual length 1, Formerly (<4.2) returned a 1 element tuple.
575575
# Don't mess with the legacy api, since it's frozen.
576-
if (info.length == 1) or (
577-
info.length is None and len(values) == 1 and not legacy_api
576+
if (
577+
(info.length == 1)
578+
or self.tagtype[tag] == TiffTags.BYTE
579+
or (info.length is None and len(values) == 1 and not legacy_api)
578580
):
579581
# Don't mess with the legacy api, since it's frozen.
580582
if legacy_api and self.tagtype[tag] in [

src/encode.c

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -790,28 +790,24 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args)
790790

791791
if (!is_core_tag) {
792792
// Register field for non core tags.
793+
if (type == TIFF_BYTE) {
794+
is_var_length = 1;
795+
}
793796
if (ImagingLibTiffMergeFieldInfo(&encoder->state, type, key_int, is_var_length)) {
794797
continue;
795798
}
796799
}
797800

798-
if (is_var_length) {
801+
if (type == TIFF_BYTE) {
802+
status = ImagingLibTiffSetField(&encoder->state,
803+
(ttag_t) key_int,
804+
PyBytes_Size(value), PyBytes_AsString(value));
805+
} else if (is_var_length) {
799806
Py_ssize_t len,i;
800807
TRACE(("Setting from Tuple: %d \n", key_int));
801808
len = PyTuple_Size(value);
802809

803-
if (type == TIFF_BYTE) {
804-
UINT8 *av;
805-
/* malloc check ok, calloc checks for overflow */
806-
av = calloc(len, sizeof(UINT8));
807-
if (av) {
808-
for (i=0;i<len;i++) {
809-
av[i] = (UINT8)PyLong_AsLong(PyTuple_GetItem(value,i));
810-
}
811-
status = ImagingLibTiffSetField(&encoder->state, (ttag_t) key_int, len, av);
812-
free(av);
813-
}
814-
} else if (type == TIFF_SHORT) {
810+
if (type == TIFF_SHORT) {
815811
UINT16 *av;
816812
/* malloc check ok, calloc checks for overflow */
817813
av = calloc(len, sizeof(UINT16));
@@ -914,10 +910,6 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args)
914910
status = ImagingLibTiffSetField(&encoder->state,
915911
(ttag_t) key_int,
916912
(FLOAT64)PyFloat_AsDouble(value));
917-
} else if (type == TIFF_BYTE) {
918-
status = ImagingLibTiffSetField(&encoder->state,
919-
(ttag_t) key_int,
920-
(UINT8)PyLong_AsLong(value));
921913
} else if (type == TIFF_SBYTE) {
922914
status = ImagingLibTiffSetField(&encoder->state,
923915
(ttag_t) key_int,

0 commit comments

Comments
 (0)