def test_custom_metadata(self): custom = { 37000: 4, 37001: 4.2, 37002: 'custom tag value', 37003: u'custom tag value', 37004: b'custom tag value' } libtiff_version = TiffImagePlugin._libtiff_version() libtiffs = [False] if distutils.version.StrictVersion(libtiff_version) >= \ distutils.version.StrictVersion("4.0"): libtiffs.append(True) for libtiff in libtiffs: TiffImagePlugin.WRITE_LIBTIFF = libtiff im = hopper() out = self.tempfile("temp.tif") im.save(out, tiffinfo=custom) TiffImagePlugin.WRITE_LIBTIFF = False reloaded = Image.open(out) for tag, value in custom.items(): if libtiff and isinstance(value, bytes): value = value.decode() self.assertEqual(reloaded.tag_v2[tag], value)
def test_custom_metadata(self): custom = { 37000: [4, TiffTags.SHORT], 37001: [4.2, TiffTags.RATIONAL], 37002: ["custom tag value", TiffTags.ASCII], 37003: [u"custom tag value", TiffTags.ASCII], 37004: [b"custom tag value", TiffTags.BYTE], } libtiff_version = TiffImagePlugin._libtiff_version() libtiffs = [False] if distutils.version.StrictVersion( libtiff_version ) >= distutils.version.StrictVersion("4.0"): libtiffs.append(True) for libtiff in libtiffs: TiffImagePlugin.WRITE_LIBTIFF = libtiff def check_tags(tiffinfo): im = hopper() out = self.tempfile("temp.tif") im.save(out, tiffinfo=tiffinfo) reloaded = Image.open(out) for tag, value in tiffinfo.items(): reloaded_value = reloaded.tag_v2[tag] if isinstance(reloaded_value, TiffImagePlugin.IFDRational): reloaded_value = float(reloaded_value) if libtiff and isinstance(value, bytes): value = value.decode() self.assertEqual(reloaded_value, value) # Test with types ifd = TiffImagePlugin.ImageFileDirectory_v2() for tag, tagdata in custom.items(): ifd[tag] = tagdata[0] ifd.tagtype[tag] = tagdata[1] check_tags(ifd) # Test without types check_tags({tag: tagdata[0] for tag, tagdata in custom.items()}) TiffImagePlugin.WRITE_LIBTIFF = False
def test_custom_metadata(self): custom = { 37000: [4, TiffTags.SHORT], 37001: [4.2, TiffTags.RATIONAL], 37002: ['custom tag value', TiffTags.ASCII], 37003: [u'custom tag value', TiffTags.ASCII], 37004: [b'custom tag value', TiffTags.BYTE] } libtiff_version = TiffImagePlugin._libtiff_version() libtiffs = [False] if distutils.version.StrictVersion(libtiff_version) >= \ distutils.version.StrictVersion("4.0"): libtiffs.append(True) for libtiff in libtiffs: TiffImagePlugin.WRITE_LIBTIFF = libtiff def check_tags(tiffinfo): im = hopper() out = self.tempfile("temp.tif") im.save(out, tiffinfo=tiffinfo) reloaded = Image.open(out) for tag, value in tiffinfo.items(): reloaded_value = reloaded.tag_v2[tag] if isinstance(reloaded_value, TiffImagePlugin.IFDRational): reloaded_value = float(reloaded_value) if libtiff and isinstance(value, bytes): value = value.decode() self.assertEqual(reloaded_value, value) # Test with types ifd = TiffImagePlugin.ImageFileDirectory_v2() for tag, tagdata in custom.items(): ifd[tag] = tagdata[0] ifd.tagtype[tag] = tagdata[1] check_tags(ifd) # Test without types check_tags({tag: tagdata[0] for tag, tagdata in custom.items()}) TiffImagePlugin.WRITE_LIBTIFF = False
def test_custom_metadata(self): tc = namedtuple("test_case", "value,type,supported_by_default") custom = { 37000 + k: v for k, v in enumerate([ tc(4, TiffTags.SHORT, True), tc(123456789, TiffTags.LONG, True), tc(-4, TiffTags.SIGNED_BYTE, False), tc(-4, TiffTags.SIGNED_SHORT, False), tc(-123456789, TiffTags.SIGNED_LONG, False), tc(TiffImagePlugin.IFDRational(4, 7), TiffTags.RATIONAL, True), tc(4.25, TiffTags.FLOAT, True), tc(4.25, TiffTags.DOUBLE, True), tc("custom tag value", TiffTags.ASCII, True), tc(b"custom tag value", TiffTags.BYTE, True), tc((4, 5, 6), TiffTags.SHORT, True), tc((123456789, 9, 34, 234, 219387, 92432323), TiffTags.LONG, True), tc((-4, 9, 10), TiffTags.SIGNED_BYTE, False), tc((-4, 5, 6), TiffTags.SIGNED_SHORT, False), tc( (-123456789, 9, 34, 234, 219387, -92432323), TiffTags.SIGNED_LONG, False, ), tc((4.25, 5.25), TiffTags.FLOAT, True), tc((4.25, 5.25), TiffTags.DOUBLE, True), # array of TIFF_BYTE requires bytes instead of tuple for backwards # compatibility tc(bytes([4]), TiffTags.BYTE, True), tc(bytes((4, 9, 10)), TiffTags.BYTE, True), ]) } libtiff_version = TiffImagePlugin._libtiff_version() libtiffs = [False] if distutils.version.StrictVersion( libtiff_version) >= distutils.version.StrictVersion("4.0"): libtiffs.append(True) for libtiff in libtiffs: TiffImagePlugin.WRITE_LIBTIFF = libtiff def check_tags(tiffinfo): im = hopper() out = self.tempfile("temp.tif") im.save(out, tiffinfo=tiffinfo) with Image.open(out) as reloaded: for tag, value in tiffinfo.items(): reloaded_value = reloaded.tag_v2[tag] if (isinstance(reloaded_value, TiffImagePlugin.IFDRational) and libtiff): # libtiff does not support real RATIONALS self.assertAlmostEqual(float(reloaded_value), float(value)) continue if libtiff and isinstance(value, bytes): value = value.decode() self.assertEqual(reloaded_value, value) # Test with types ifd = TiffImagePlugin.ImageFileDirectory_v2() for tag, tagdata in custom.items(): ifd[tag] = tagdata.value ifd.tagtype[tag] = tagdata.type check_tags(ifd) # Test without types. This only works for some types, int for example are # always encoded as LONG and not SIGNED_LONG. check_tags({ tag: tagdata.value for tag, tagdata in custom.items() if tagdata.supported_by_default }) TiffImagePlugin.WRITE_LIBTIFF = False