在修改元数据后保存图像时出现问题。 基本上,我想打开我的图像,显示它,修改它的EXIF元数据,然后保存它。
首先,我在尝试保存图像时遇到问题,因为原始文件被锁定(我有一个通用的GTI +错误)。在阅读了一些帖子并找到问题后,我用using关键字解决了锁定问题。
但问题是,如果我使用“using”,我的Image的propertyItems列表为空,我无法修改我的元数据。
以下是我加载图片的方式(使用不同的测试)
this.image = new Bitmap(this.path); // this cause lock on file
/* the following doesn't lock the file, but image.propertyItems is empty */
//using (var bmpTemp = new Bitmap(this.path))
//{
// this.image = new Bitmap(bmpTemp);
//}
使用streamReader或MemoryStream无济于事......
以下是我修改和保存图片的方法:
PropertyItem p = this.photo.Image.GetPropertyItem(0x5090);
p.Id = 0x320;
p.Type = 2; // Type ASCII
p.Len = boxTitle.Text.Length;
p.Value = Encoding.ASCII.GetBytes(boxTitle.Text);
this.photo.Image.SetPropertyItem(p);
this.photo.Image.Save(this.photo.Path);
你能解释一下为什么当我使用“使用”时没有propertyItems,我该如何修改图像元数据而不是保存它?
答案 0 :(得分:1)
您必须在阅读后单独保留原始图像,修改属性值,然后将其另存为新图像。显然,Microsoft没有在内存中复制元数据 - 只有更改。因此原始图像保持锁定以保留原始元数据。要修改图像的元数据,请保存新图像,然后用它替换旧图像(或删除并重命名)。
答案 1 :(得分:1)
似乎Bitmap
构造函数不复制PropertyItems
。您可以在图像之间复制PropertyItems
,然后释放文件:
using (var bmpTemp = new Bitmap(this.path))
{
this.image = new Bitmap(bmpTemp);
foreach (var pi in bmpTemp.PropertyItems)
{
this.image.SetPropertyItem(pi);
}
}
这似乎比复制文件更好。