From 113689eafe44f98a4139791b353797afa941e55b Mon Sep 17 00:00:00 2001 From: Felix Haller Date: Wed, 21 Sep 2016 13:27:51 +0200 Subject: [PATCH 1/2] Load JPEG files independent of suffix * cleaned up load() * added dirty hack to load() (see comments) * added test for loading tests/images/02.docx (a jpeg file with wrong suffix) * all tests still working --- piexif/_load.py | 39 +++++++++++++++++---------------------- tests/images/02.docx | Bin 0 -> 14513 bytes tests/s_test.py | 25 ++++++++++++++++++------- 3 files changed, 35 insertions(+), 29 deletions(-) create mode 100644 tests/images/02.docx diff --git a/piexif/_load.py b/piexif/_load.py index 1c4a4c8..61c78d5 100644 --- a/piexif/_load.py +++ b/piexif/_load.py @@ -1,5 +1,5 @@ import struct - +import sys from ._common import * from ._exif import * @@ -17,13 +17,22 @@ def load(input_data): :return: Exif data({"0th":dict, "Exif":dict, "GPS":dict, "Interop":dict, "1st":dict, "thumbnail":bytes}) :rtype: dict """ - exif_dict = {"0th":{}, - "Exif":{}, - "GPS":{}, - "Interop":{}, - "1st":{}, - "thumbnail":None} - exifReader = _ExifReader(input_data) + exif_dict = {"0th": {}, + "Exif": {}, + "GPS": {}, + "Interop": {}, + "1st": {}, + "thumbnail": None} + # this is just a hack to make it work. + # The load function (IMHO) has to be redesigned because it has to deal with + # incoming bytes and strings (filenames) + if isinstance(input_data, str): + with open(input_data, 'rb') as f: + data = f.read() + else: + data = input_data + + exifReader = _ExifReader(data) if exifReader.tiftag is None: return exif_dict @@ -71,20 +80,6 @@ def __init__(self, data): self.tiftag = data elif data[0:4] == b"Exif": # Exif self.tiftag = data[6:] - elif data[-4:].lower() in (".jpg", "jpeg", ".jpe", ".tif", "tiff"): - with open(data, 'rb') as f: - data = f.read() - if data[0:2] == b"\xff\xd8": # JPEG - segments = split_into_segments(data) - app1 = get_exif_seg(segments) - if app1: - self.tiftag = app1[10:] - else: - self.tiftag = None - elif data[0:2] in (b"\x49\x49", b"\x4d4d"): # TIFF - self.tiftag = data - else: - raise ValueError("Given file is neither JPEG nor TIFF.") else: raise ValueError("Given file is neither JPEG nor TIFF.") diff --git a/tests/images/02.docx b/tests/images/02.docx new file mode 100644 index 0000000000000000000000000000000000000000..ba296e5640a0d76efc4133111913dee22b51b7b6 GIT binary patch literal 14513 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 Date: Wed, 21 Sep 2016 14:17:40 +0200 Subject: [PATCH 2/2] Now Python 2.7 compatible * STILL DIRTY! --- piexif/_load.py | 9 ++++----- tests/s_test.py | 24 ++++++++++++------------ 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/piexif/_load.py b/piexif/_load.py index 61c78d5..477b846 100644 --- a/piexif/_load.py +++ b/piexif/_load.py @@ -1,5 +1,4 @@ import struct -import sys from ._common import * from ._exif import * @@ -7,7 +6,7 @@ LITTLE_ENDIAN = b"\x49\x49" -def load(input_data): +def load(input_data, byte_data=False): """ py:function:: piexif.load(filename) @@ -26,11 +25,11 @@ def load(input_data): # this is just a hack to make it work. # The load function (IMHO) has to be redesigned because it has to deal with # incoming bytes and strings (filenames) - if isinstance(input_data, str): + if byte_data: + data = input_data + else: with open(input_data, 'rb') as f: data = f.read() - else: - data = input_data exifReader = _ExifReader(data) if exifReader.tiftag is None: diff --git a/tests/s_test.py b/tests/s_test.py index 1866d73..40fc1e8 100644 --- a/tests/s_test.py +++ b/tests/s_test.py @@ -118,7 +118,7 @@ def test_load(self): def test_load_m(self): """'load' on memory. """ - exif = piexif.load(I1) + exif = piexif.load(I1, True) e = load_exif_by_PIL(INPUT_FILE1) print("********************\n\n" + INPUT_FILE1 + "\n") self._compare_piexifDict_PILDict(exif, e) @@ -133,14 +133,14 @@ def test_load_tif(self): o = io.BytesIO() im.save(o, format="jpeg", exif=exif_bytes) im.close() - exif2 = piexif.load(o.getvalue()) + exif2 = piexif.load(o.getvalue(), True) zeroth_ifd2 = exif2["0th"] self.assertDictEqual(zeroth_ifd, zeroth_ifd2) def test_load_tif_m(self): with open(INPUT_FILE_TIF, "rb") as f: tif = f.read() - exif = piexif.load(tif) + exif = piexif.load(tif, True) zeroth_ifd = exif["0th"] exif_bytes = piexif.dump({"0th":zeroth_ifd}) @@ -148,7 +148,7 @@ def test_load_tif_m(self): o = io.BytesIO() im.save(o, format="jpeg", exif=exif_bytes) im.close() - exif2 = piexif.load(o.getvalue()) + exif2 = piexif.load(o.getvalue(), True) zeroth_ifd2 = exif2["0th"] self.assertDictEqual(zeroth_ifd, zeroth_ifd2) @@ -159,14 +159,14 @@ def test_load_fail(self): with self.assertRaises(ValueError): exif = piexif.load(os.path.join("tests", "images", "notjpeg.jpg")) - with self.assertRaises(FileNotFoundError): + with self.assertRaises(IOError): exif = piexif.load("foo") def test_load_from_pilImage_property(self): o = io.BytesIO() i = Image.open(INPUT_FILE1) exif = i.info["exif"] - exif_dict = piexif.load(exif) + exif_dict = piexif.load(exif, True) exif_bytes = piexif.dump(exif_dict) i.save(o, "jpeg", exif=exif_bytes) i.close() @@ -237,7 +237,7 @@ def test_dump_and_load(self): im.save(o, format="jpeg", exif=exif_bytes) im.close() o.seek(0) - exif = piexif.load(o.getvalue()) + exif = piexif.load(o.getvalue(), True) zeroth_ifd, exif_ifd, gps_ifd = exif["0th"], exif["Exif"], exif["GPS"] zeroth_ifd.pop(ImageIFD.ExifTag) # pointer to exif IFD zeroth_ifd.pop(ImageIFD.GPSTag) # pointer to GPS IFD @@ -265,7 +265,7 @@ def test_dump_and_load2(self): im.save(o, format="jpeg", exif=exif_bytes) im.close() o.seek(0) - exif = piexif.load(o.getvalue()) + exif = piexif.load(o.getvalue(), True) exif["0th"].pop(ImageIFD.ExifTag) # pointer to exif IFD exif["0th"].pop(ImageIFD.GPSTag) # pointer to GPS IFD exif["Exif"].pop(ExifIFD.InteroperabilityTag) @@ -320,7 +320,7 @@ def test_dump_and_load3(self): "Exif":{ExifIFD.ISOSpeed:long_v[x]}, "GPS":{GPSIFD.GPSVersionID:byte_v[x]},} exif_bytes = piexif.dump(exif_dict) - e = piexif.load(exif_bytes) + e = piexif.load(exif_bytes, True) self.assertEqual( e["0th"][ImageIFD.ProcessingSoftware].decode("latin1"), ascii_v[x]) @@ -341,7 +341,7 @@ def test_roundtrip_files(self): exif_bytes = piexif.dump(exif) o = io.BytesIO() piexif.insert(exif_bytes, input_file, o) - e = piexif.load(o.getvalue()) + e = piexif.load(o.getvalue(), True) t = e.pop("thumbnail") thumbnail = exif.pop("thumbnail") @@ -394,7 +394,7 @@ def test_transplant_m(self): """ o = io.BytesIO() piexif.transplant(I1, I2, o) - self.assertEqual(piexif.load(I1), piexif.load(o.getvalue())) + self.assertEqual(piexif.load(I1, True), piexif.load(o.getvalue(), True)) Image.open(o).close() def test_transplant_fail1(self): @@ -445,7 +445,7 @@ def test_remove_m(self): with self.assertRaises(ValueError): piexif.remove(I1) piexif.remove(I1, o) - exif_dict = piexif.load(o.getvalue()) + exif_dict = piexif.load(o.getvalue(), True) none_dict = {"0th":{}, "Exif":{}, "GPS":{},