【问题标题】:Python: Remove Exif info from imagesPython:从图像中删除 Exif 信息
【发布时间】:2013-11-16 04:02:23
【问题描述】:

为了减少要在网站中使用的图像的大小,我将质量降低到 80-85%。这在一定程度上减小了图像大小。

为了在不影响质量的情况下进一步缩小尺寸,我的朋友指出,来自相机的原始图像有很多称为 Exif 信息的元数据。由于不需要为网站中的图像保留此 Exif 信息,我们可以将其删除。这将进一步减少 3-10 kB 的大小。

但我无法在我的 Python 代码中找到合适的库来执行此操作。我浏览了相关问题,并尝试了一些方法:

原图:http://mdb.ibcdn.com/8snmhp4sjd75vdr27gbadolc003i.jpg

  1. Mogrify

    /usr/local/bin/mogrify -strip filename
    

    结果:http://s23.postimg.org/aeaw5x7ez/8snmhp4sjd75vdr27gbadolc003i_mogrify.jpg 这种方法将大小从 105 kB 减小到 99.6 kB,但也改变了颜色质量。

  2. Exif-tool

    exiftool -all= filename
    

    结果:http://s22.postimg.org/aiq99o775/8snmhp4sjd75vdr27gbadolc003i_exiftool.jpg 这种方法将大小从 105 kB 减小到 72.7 kB,但也改变了颜色质量。

  3. This answer详细解释了如何操作Exif信息,但是如何使用它来删除信息呢?

谁能帮我删除所有额外的元数据而不改变图像的颜色、尺寸和其他属性?

【问题讨论】:

  • ExifTool 修改“颜色质量”是错误的(改变实际像素?颜色?压缩?)。将原始结果和结果与 IM 的 comparecompare -metric AE 8snmhp4sjd75vdr27gbadolc003i.jpg 8snmhp4sjd75vdr27gbadolc003i_exiftool.jpg null: 进行比较,您将获得零差异(或使用 JPEGsnoop 等)。您可能会感到困惑,因为原始嵌入了 icc-profile 而结果没有,并且您在色彩管理应用程序中比较它们。但是您可以剥离除 icc-profile 之外的所有内容:exiftool -all= --icc_profile:all 8snmhp4sjd75vdr27gbadolc003i.jpg 并在 icc-profile 不变的情况下获得 74.1 kb
  • 关于方法 3 (Exif-py),看起来该工具用于从图像中提取 Exif 信息,以便您可以在程序中访问它,而不是从图像文件中删除它。我不认为它是为修改图像文件而设计的。

标签: python image-processing python-imaging-library exif exiftool


【解决方案1】:
from PIL import Image

image = Image.open('image_file.jpeg')

# next 3 lines strip exif
data = list(image.getdata())
image_without_exif = Image.new(image.mode, image.size)
image_without_exif.putdata(data)

image_without_exif.save('image_file_without_exif.jpeg')

【讨论】:

【解决方案2】:

对我来说,gexiv2 工作正常:

#!/usr/bin/python3

from gi.repository import GExiv2

exif = GExiv2.Metadata('8snmhp4sjd75vdr27gbadolc003i.jpg')
exif.clear_exif()
exif.clear_xmp()
exif.save_file()

另请参阅Exif manipulation library for python,您已链接,但未阅读所有答案;)

【讨论】:

    【解决方案3】:

    您可以尝试使用Python Image Lirbary (PIL) 加载图像,然后将其再次保存到其他文件。这应该会删除元数据。

    【讨论】:

    【解决方案4】:

    您甚至不需要执行@user2141737 建议的额外步骤。只需使用 PIL 打开它并再次保存它似乎就可以了:

    from PIL import Image
    image = Image.open('path/to/image')
    image.save('new/path/' + file_name)
    

    【讨论】:

    • 这似乎是假的?就像你说的那样,通过 pil 进行操作时,我仍然会看到各种元数据。
    • 是的,这是不正确的。请不要这样做!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    相关资源
    最近更新 更多