我正在将一些图像(jpeg)元数据写入图像。 问题 - 我收到了一些文件的问题:"图像数据在处理过程中产生溢出。"尝试保存一些新元数据,在此示例中为关键字。
最重要的问题是如何做到这一点"对"避免.NET失败。但是我也提供了暂时解决这个问题的方法,因为我已经看到了相关的未解决的问题。
我一直试图解决这个问题,但今天我找到了原因。某些程序(如Photoshop)会向xmpmeta部分写入大量数据。所以当我执行代码时:
*//...prepare metadata before*
BitmapMetadata JpegMeta = JpegDecoder.Frames[0].Metadata.Clone() as BitmapMetadata;
var s = string.Join(";", parms.Keywords.ToArray());
///THIS STANDRAT ONE generates OVERFLOW on some images ~1-2%
JpegMeta.Keywords = new ReadOnlyCollection<string>parms.Keywords.ToArray());
//Bellow is doint ghe smae manually
//Following GENERATES OVERFLOW on some images ~1-2%:
JpegMeta.SetQuery("System.Keywords", parms.Keywords.ToArray());
JpegMeta.SetQuery("/xmp/dc:subject", new BitmapMetadata("xmpbag"));
for (int i = 0; i <= parms.Keywords.Count - 1; i++){
string sOrder = "/{ulong=" + i + "}";
string key = parms.Keywords[i];
JpegMeta.SetQuery("/xmp/<xmpbag>dc:subject" + sOrder, key);
//Following GENERATES OVERFLOW on some images ~1-2%:
JpegMeta.SetQuery("/xmp/<xmpbag>MicrosoftPhoto:LastKeywordXMP"+sOrder, key);
//Following GENERATES OVERFLOW on some images ~1-2%:
JpegMeta.SetQuery("/xmp/<xmpbag>MicrosoftPhoto:LastKeywordIPTC" + sOrder, key);
}
JpegMeta.SetQuery("/app1/ifd/{ushort=18247}", Encoding.Unicode.GetBytes(s));
JpegMeta.SetQuery("/app1/ifd/{ushort=40094}", Encoding.Unicode.GetBytes(s));
*//...save metadata further*
无法保存。
此代码解决了我所知道的保存元数据的所有可能部分和方法(特别是关键字不同的程序倾向于使用或优先考虑不同的现代和遗留部分,因此我们必须写入所有部分)。
此错误仅在某些文件上显示。当我打开&#34;坏&#34;我注意到了这个问题。带有记事本的文件,并手动复制和检查它们的xml rdf部分以及来自&#34; good&#34;那些。我发现Photoshop,Camera Raw等人写了很多关于图像内容的信息。有时滚动需要很多页面,这反过来会导致.NET失败。因此,如果我删除一些数据,例如运行这样的命令:
JpegMeta.RemoveQuery("/xmp/crs:PaintBasedCorrections");
我的查询工作正常。我可以查看该文件并删除许多其他可能无法被任何人使用的文件。
但这种方法很糟糕,因为首先我要删除某些情况下某些人可能需要的数据,但最重要的是我不知道下一次哪个部分会太大。如果某人关闭并打开PSD文件1000次,将导致1000段记录图像历史并保存为JPEG,当我想使用此文件时,.NET将再次失败。
欢迎提出建议。