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

C# 替换JPG图像文件中的图像,但保留元数据?,c#,.net,image,image-processing,jpeg,C#,.net,Image,Image Processing,Jpeg,是否可以替换JPG的图像部分,但保留嵌入的元数据?或者,是否有一种方法可以可靠地将所有元数据从一个JPG图像复制到另一个JPG图像 背景:我有一个存储JPG图像的ASP.NET web应用程序。用户使用tinyMCE图像编辑器在浏览器中编辑图像(调整大小、裁剪等),然后浏览器将修改后的图像发送到服务器。我需要用编辑过的图像文件替换原始图像文件,同时保留原始元数据 我的第一种方法是复制System.Drawing.Imaging.PropertyItems,并使用InPlaceBitmapMeta

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

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

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

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

我认为这可以帮助您

我看到了如何从jpg文件中提取所有元数据

现在,如果您拥有原始文件的元数据,则可以使用该元数据创建新文件。我发现了如何使用ImageMagick添加元数据的方法


我希望这能帮助你

你可以用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

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

exiftool -TagsFromFile  sourceImg.jpg target.jpg
-TagsFromFile
表示您正在复制元数据

如果不希望exiftool生成备份文件,请在
-TagsFromFile
之前添加
-overwrite\u original


如果要复制选定的标记或执行递归,请参见此。

如果ImageMagick可以工作,那将非常好,因为它已经集成到我的软件中。但我找不到任何证据证明它有这种能力。你能说得更具体一点吗?@Roger抱歉,我在电话里写了一个简短的回答:SThanks-我确认这在图像大小相同时效果很好,但正如你所暗示的,当图像大小不同时,它会变得更复杂。例如,当编辑后的图像小于原始图像时,我必须在合成操作后进行裁剪:convert.exe original.jpg edited.jpg-composite-| convert-?裁剪320x305+0+0 out.jpg。还有一个问题是,某些原始元数据不再准确地描述编辑的图像(宽度、高度)。但我可以用它。干杯别忘了,你可以用括号只对一个或另一个图像应用调整大小<代码>转换image1.jpg\(image2.jpg-调整大小1000x2000\)-合成结果.jpg