【问题标题】:Replace the image in a JPG image file but keep the metadata?替换 JPG 图像文件中的图像但保留元数据?
【发布时间】:2016-03-24 13:11:11
【问题描述】:

是否可以替换 JPG 的图像部分但保留嵌入的元数据?或者,有没有办法可靠地将所有元数据从一个 JPG 图像复制到另一个?

背景:我有一个存储 JPG 图像的 ASP.NET Web 应用程序。用户使用 tinyMCE 图像编辑器在浏览器中编辑图像(调整大小、裁剪等),然后浏览器将修改后的图像发送到服务器。我需要在保留原始元数据的同时将原始图像文件替换为已编辑的图像文件。

我的第一种方法是复制 System.Drawing.Imaging.PropertyItems 并使用 InPlaceBitmapMetadataWriter 复制一些项目,但是这种方法会丢失许多属性。我需要更可靠的东西,我想到如果我可以替换可能是票的图像部分。但谷歌搜索并没有透露任何信息。

这是一个开源产品(Gallery Server),因此任何库都必须与此许可证兼容。

【问题讨论】:

    标签: c# .net image image-processing jpeg


    【解决方案1】:

    您可以使用 ImageMagick 做到这一点 - 这是一种方法。

    使用您想要保留的元数据加载原始图像,然后加载 “假” 图像并将其合成到原始图像的顶部并保存,ImageMagick 将保留原始图像的元数据。举个例子吧。

    这是一张原图,我们用jhead查看元数据

    jhead original.jpg
    
    File name    : original.jpg
    File size    : 2080473 bytes
    File date    : 2015:12:18 09:05:53
    Camera make  : Apple
    Camera model : iPhone 4S
    Date/Time    : 2014:12:25 15:02:27
    Resolution   : 3264 x 2448
    Flash used   : No
    Focal length :  4.3mm  (35mm equivalent: 35mm)
    Exposure time: 0.0083 s  (1/120)
    Aperture     : f/2.4
    ISO equiv.   : 50
    Whitebalance : Auto
    Metering Mode: pattern
    Exposure     : program (auto)
    GPS Latitude : N 54d 26m 14.84s
    GPS Longitude: W  3d  5m 49.91s
    GPS Altitude :  226.00m
    JPEG Quality : 95
    

    现在,我们运行我建议的过程,在顶部合成一个相同大小的灰色(假)图像:

    convert original.jpg fake.jpg -composite new.jpg
    

    我们得到了这个:

    如果我们检查新图像的元数据:

    jhead new.jpg
    
    File name    : new.jpg
    File size    : 43408 bytes
    File date    : 2015:12:18 09:08:30
    Camera make  : Apple
    Camera model : iPhone 4S
    Date/Time    : 2014:12:25 15:02:27
    Resolution   : 3264 x 2448
    Color/bw     : Black and white
    Flash used   : No
    Focal length :  4.3mm  (35mm equivalent: 35mm)
    Exposure time: 0.0083 s  (1/120)
    Aperture     : f/2.4
    ISO equiv.   : 50
    Whitebalance : Auto
    Metering Mode: pattern
    Exposure     : program (auto)
    GPS Latitude : N 54d 26m 14.84s
    GPS Longitude: W  3d  5m 49.91s
    GPS Altitude :  226.00m
    JPEG Quality : 96
    

    ...突然间,我两分钟前在我的 Mac 上制作的灰色矩形拍摄于去年圣诞节,拍摄地点与湖区的原版完全相同 :-)

    如果你的假图像和原图大小不同,你可以在合成之前强制它们为一个共同的大小(这样假图完全覆盖原图),如下所示:

    convert original.jpg fake.jpg -resize 3264x2446! -composite new.jpg
    

    【讨论】:

    • 谢谢 - 我确认这在图像大小相同时效果很好,但正如你暗示的那样,当它们不同时它会变得更加复杂。比如编辑后的图片小于原图时,我要在合成操作后进行裁剪:convert.exe original.jpgedited.jpg -composite - |转换 - -crop 320x305+0+0 out.jpg。还有一些原始元数据不再准确描述编辑图像(宽度、高度)的问题。但我可以使用它。干杯!
    • 不要忘记您可以使用括号来仅将调整大小应用于其中一个或另一个图像...convert image1.jpg \( image2.jpg -resize 1000x2000 \) -composite result.jpg
    【解决方案2】:

    用于在图像之间复制元数据。您可以使用 exiftool,它专为元数据操作而设计。

    exiftool -TagsFromFile  sourceImg.jpg target.jpg
    

    -TagsFromFile 表示您正在复制元数据。

    如果您不希望 exiftool 生成备份文件,请在 -TagsFromFile 之前添加 -overwrite_original

    如果您想复制选定的标签或执行递归,请参阅此answer

    【讨论】:

      【解决方案3】:

      我觉得ImageMagick可以帮到你。

      我在that ImageMagick example 看到了如何从 jpg 文件中提取所有元数据。

      现在,如果您拥有原始文件的元数据,您可以使用该元数据创建一个新文件。我找到了a example 如何使用 ImageMagick 添加元数据

      希望对你有帮助

      【讨论】:

      • 如果 ImageMagick 可以工作,那就太好了,因为它已经集成到我的软件中了。但我找不到任何证据表明它具有这种能力。你能说得更具体点吗?
      • @Roger 对不起,我是从我的手机里来的,我写了一个简短的答案:S
      猜你喜欢
      • 2016-09-24
      • 2019-02-28
      • 1970-01-01
      • 2022-06-12
      • 2021-01-08
      • 1970-01-01
      • 2018-11-30
      • 2018-11-12
      • 1970-01-01
      相关资源
      最近更新 更多