替换JPG图像文件中的图像,但保留元数据?

时间:2015-12-17 22:11:14

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

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

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

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

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

3 个答案:

答案 0 :(得分: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

enter image description here

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

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

我们得到了这个:

enter image description here

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

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

答案 1 :(得分:1)

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

exiftool -TagsFromFile  sourceImg.jpg target.jpg

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

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

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

答案 2 :(得分:-1)

我认为ImageMagick可以帮到你。

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

enter image description here

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

添加元数据

我希望这可以帮到你