using (Tiff iimage = Tiff.Open("new.tif", "r"))
{
Tiff newiimage = Tiff.Open("newnew.tif", "w");
if (image == null)
{
MessageBox.Show("Could not open incoming image");
return;
}
using (StreamWriter writer = new StreamWriter("EnumerateTiffTags.txt"))
{
short numberOfDirectories = iimage.NumberOfDirectories();
for (short d = 0; d < numberOfDirectories; ++d)
{
iimage.SetDirectory((short)d);
for (ushort t = ushort.MinValue; t < ushort.MaxValue; ++t)
{
TiffTag tag = (TiffTag)t;
var value = iimage.GetField(tag);
if (value != null)
{
for (int j = 0; j < value.Length; j++)
{
writer.WriteLine("{0}", tag.ToString());
writer.WriteLine("{0} : {1}",
value[j].Value.GetType().ToString(), value[j].ToString());
}
newiimage.SetField(tag, value);// this line is giving me..
// an error "Unable to cast object of type 'BitMiracle.LibTiff.Classic.FieldValue[]'
// to type 'System.IConvertible'"
}
}
}
}
}
我打开一个文件读取标签值并将它们写入另一个TIFF文件。 SetField函数中出现此问题。 我试过调试它,一切看起来都很好,不能弄清楚,为什么它会抛出错误。
答案 0 :(得分:1)
在LibTiff中,我使用SetField
方法期望的是实际值,而不是FieldValue
个对象。所以你可以尝试这样的事情:
newiimage.SetField(tag, value.Select(v => v.Value).ToArray());
答案 1 :(得分:1)
根据GetField方法的文档,其返回集中有实数和伪标记。
TiffTag.JPEGQUALITY是伪标签的一个例子。
您无法设置伪标记,因此必须将它们从写循环中排除。
Well-known tags列表可以帮助您编写过滤器..
可能还需要写出无法编写的标签,以使过滤器更完整。
我不知道伪标签的确切性质,但考虑到tiff格式的开放性,你可能建议你包括对未见到的后来者的错误处理。