设置JPEG元数据 - 实现问题

6

经过之前的研究,我发现设置图像的元数据属性并不太难。例如,我可以将JPEG图像读入一个Bitmap对象,并通过该图像的SetPropertyItem方法更改其“拍摄日期”(我已经研究了这个操作的格式和枚举)。

然而,虽然实际的元数据部分似乎很容易,但我面临着一些令人烦恼的实现问题:

1)当我在位图上调用Save()时,似乎没有使用图像的原始编码设置。因此,压缩级别会发生变化(可能是某个默认值);我可以看到保存后的文件大小显著缩小。我知道您可以在Save()调用中自定义图像的编码设置,但老实说,我只想更改图片的元数据;难道没有任何简单的方法可以只使用原始编码设置保存图像吗?即使我能够直接引用Save()调用中图像的现有编码设置,那也会有帮助。

2)显然,在将图像读入Bitmap对象时,原始文件被锁定。因此,我不能在原始文件名下保存图像,除非进行大量的操作:目前,我正在将从文件中读取的图像绘制到离屏位图上,处理完原始图像,然后保存离屏位图。同样,这似乎是一项非常繁琐的额外工作,当我只想更新图像文件中的元数据时。

如果您能提供任何建议,将不胜感激...为了更新JPEG文件的元数据(其中大部分与实际元数据更改无关),我所做的工作量使我怀疑自己是否错过了一些更简单或更好的方法。


1
JPEG是一种有损格式,每次保存时即使使用相同的设置,您也会丢失信息。唯一的解决方法是使用不解压图像的库。 - Mark Ransom
1个回答

1
你想要做的是编辑EXIF数据。而你现在所做的是重新压缩图像,这会导致质量损失,正如你所注意到的那样。
请参考以下代码示例来编辑EXIF:http://www.dreamincode.net/code/snippet3144.htm

我使用了那段代码示例来更新图像上的exif标签 36867、306和36868,并验证了标签确实已经设置。即便如此,当我将鼠标悬停在Windows资源管理器中保存的图像上时,工具提示仍然显示它是在旧日期拍摄而不是我在这三个标签中设置的新日期。我还漏掉了什么吗?此外,文件大小仍然与原始大小不同;有没有办法只是访问JPEG文件并更改一些元数据而无需重新保存整个文件? - Brandon Amoroso
文件大小有多大的不同?是的,它应该可以工作,并且只需编辑EXIF数据。嗯。此外,Windows资源管理器可能已经在thumbs.db中缓存了信息,但我不确定。 - Brad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接