From b1fdff4034d3f2c33ba534ed10d8fd966fd32993 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 11 Sep 2015 23:44:23 +0100 Subject: [PATCH] In a twisty maze of bytes, text and arbitrary metadata, py2 and py3. New IFD is putting textdata in type7 metadata and returning bytes, old one put it in type 2 string and returned a string. This may be an issue --- PIL/TiffImagePlugin.py | 2 +- Tests/test_file_tiff_metadata.py | 15 +++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index 4638acd8f..243524e0f 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -361,7 +361,7 @@ class ImageFileDirectory_v2(collections.MutableMapping): self.tagtype[tag] = 2 if self.tagtype[tag] == 7 and bytes is not str: - values = [value.encode("ascii") if isinstance(value, str) else value + values = [value.encode("ascii",'replace') if isinstance(value, str) else value for value in values] values = tuple(info.cvt_enum(value) for value in values) if info.length == 1: diff --git a/Tests/test_file_tiff_metadata.py b/Tests/test_file_tiff_metadata.py index 449c67517..0a7425d7b 100644 --- a/Tests/test_file_tiff_metadata.py +++ b/Tests/test_file_tiff_metadata.py @@ -18,29 +18,32 @@ class TestFileTiffMetadata(PillowTestCase): img = hopper() basetextdata = "This is some arbitrary metadata for a text field" - textdata = basetextdata + " \xff" + textdata = basetextdata + " \xff" + reloaded_textdata = basetextdata.encode('ascii') + b" ?" floatdata = 12.345 doubledata = 67.89 info = TiffImagePlugin.ImageFileDirectory() - info[tag_ids['ImageJMetaDataByteCounts']] = len(textdata) + info[tag_ids['ImageJMetaDataByteCounts']] = len(reloaded_textdata) info[tag_ids['ImageJMetaData']] = textdata info[tag_ids['RollAngle']] = floatdata info.tagtype[tag_ids['RollAngle']] = 11 info[tag_ids['YawAngle']] = doubledata info.tagtype[tag_ids['YawAngle']] = 12 + print(info.tagtype) + f = self.tempfile("temp.tif") img.save(f, tiffinfo=info) loaded = Image.open(f) - self.assertEqual(loaded.tag[50838], (len(basetextdata + " ?"),)) - self.assertEqual(loaded.tag_v2[50838], len(basetextdata + " ?")) + self.assertEqual(loaded.tag[50838], (len(reloaded_textdata),)) + self.assertEqual(loaded.tag_v2[50838], len(reloaded_textdata)) - self.assertEqual(loaded.tag[50839], basetextdata + " ?") - self.assertEqual(loaded.tag_v2[50839], basetextdata + " ?") + self.assertEqual(loaded.tag[50839], reloaded_textdata) + self.assertEqual(loaded.tag_v2[50839], reloaded_textdata) loaded_float = loaded.tag[tag_ids['RollAngle']][0]