From e34bc19f7126b80764a4c8747a7a2a1636289396 Mon Sep 17 00:00:00 2001 From: jvoisin <julien.voisin@dustri.org> Date: Mon, 16 Apr 2018 22:27:29 +0200 Subject: [PATCH] Add support for BMP MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit To be completely honest, BMP have no metadata, but we still add it, just in caseâ„¢ --- src/images.py | 14 ++++++++++++++ tests/data/dirty.bmp | Bin 0 -> 5746 bytes tests/test_libmat2.py | 15 +++++++++++++++ 3 files changed, 29 insertions(+) create mode 100644 tests/data/dirty.bmp diff --git a/src/images.py b/src/images.py index 06f3e22..707207b 100644 --- a/src/images.py +++ b/src/images.py @@ -75,3 +75,17 @@ class TiffParser(GdkPixbufAbstractParser): 'FileTypeExtension', 'ImageHeight', 'ImageSize', 'ImageWidth', 'MIMEType', 'Megapixels', 'SourceFile'} + +class BMPParser(GdkPixbufAbstractParser): + mimetypes = {'image/bmp', 'image/x-ms-bmp'} + meta_whitelist = {'SourceFile', 'ExifToolVersion', 'FileName', 'Directory', + 'FileSize', 'FileModifyDate', 'FileAccessDate', + 'FileInodeChangeDate', 'FilePermissions', 'FileType', + 'FileTypeExtension', 'MIMEType', 'BMPVersion', 'ImageWidth', + 'ImageHeight', 'Planes', 'BitDepth', 'Compression', 'ImageLength', + 'PixelsPerMeterX', 'PixelsPerMeterY', 'NumColors', + 'NumImportantColors', 'RedMask', 'GreenMask', 'BlueMask', + 'AlphaMask', 'ColorSpace', 'RedEndpoint', 'GreenEndpoint', + 'BlueEndpoint', 'GammaRed', 'GammaGreen', 'GammaBlue', 'ImageSize', + 'Megapixels'} + diff --git a/tests/data/dirty.bmp b/tests/data/dirty.bmp new file mode 100644 index 0000000000000000000000000000000000000000..be9094d1f8e9f9e9ae0584863c2aa6cb48b7f05d GIT binary patch literal 5746 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 literal 0 HcmV?d00001 diff --git a/tests/test_libmat2.py b/tests/test_libmat2.py index 34f7301..ae04dc2 100644 --- a/tests/test_libmat2.py +++ b/tests/test_libmat2.py @@ -307,3 +307,18 @@ class TestCleaning(unittest.TestCase): self.assertEqual(p.get_meta(), {}) os.remove('./tests/data/clean.tiff') + + def test_bmp(self): + shutil.copy('./tests/data/dirty.bmp', './tests/data/clean.bmp') + p = images.BMPParser('./tests/data/clean.bmp') + + meta = p.get_meta() + self.assertEqual(meta, {}) # bmp has no meta :) + + ret = p.remove_all() + self.assertTrue(ret) + + p = images.BMPParser('./tests/data/clean.bmp.cleaned') + self.assertEqual(p.get_meta(), {}) + + os.remove('./tests/data/clean.bmp') -- GitLab