C# 使用Libtiff复制TIFF图像 使用(Tiff iimage=Tiff.Open(“new.tif”、“r”)) { Tiff newiimage=Tiff.Open(“newnew.tif”,“w”); if(image==null) { MessageBox.Show(“无法打开传入图像”); 返回; } 使用(StreamWriter=newstreamwriter(“EnumerateTiffTags.txt”)) { short numberOfDirectories=iimage.numberOfDirectories(); 对于(短d=0;d
我正在打开一个文件,读取标记值并将其写入另一个TIFF文件。该问题发生在SetField函数中。C# 使用Libtiff复制TIFF图像 使用(Tiff iimage=Tiff.Open(“new.tif”、“r”)) { Tiff newiimage=Tiff.Open(“newnew.tif”,“w”); if(image==null) { MessageBox.Show(“无法打开传入图像”); 返回; } 使用(StreamWriter=newstreamwriter(“EnumerateTiffTags.txt”)) { short numberOfDirectories=iimage.numberOfDirectories(); 对于(短d=0;d,c#,.net,compression,tiff,libtiff,C#,.net,Compression,Tiff,Libtiff,我正在打开一个文件,读取标记值并将其写入另一个TIFF文件。该问题发生在SetField函数中。 我试着调试它,一切似乎都很好,不太明白它为什么会抛出错误。在LibTiff中,我使用的SetField方法期望的是实际值,而不是FieldValue对象。因此,您可以尝试以下方法: using (Tiff iimage = Tiff.Open("new.tif", "r")) { Tiff newiimage = Tiff.Open("newnew.tif
我试着调试它,一切似乎都很好,不太明白它为什么会抛出错误。在LibTiff中,我使用的
SetField
方法期望的是实际值,而不是FieldValue
对象。因此,您可以尝试以下方法:
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'"
}
}
}
}
}
根据该方法的Doc,其返回集中既有实标记,也有伪标记 TiffTag.JPEGQUALITY是伪标记的一个示例 您不能设置伪标记,因此必须将它们从写循环中排除 列表可能会帮助您编写筛选器 为了使过滤器更加完整,可能还需要写出无法写入的标记
我不知道伪标记的确切性质,但考虑到tiff格式的开放性,建议您将错误处理包括在未被超越的迟到者中。谢谢您的回复。那么,您的解决方案中“值”的数据类型是什么。因为我试图提取和复制所有标签,“值”可以是任何东西,对吗?如果我的方法看起来很幼稚,请原谅。谢谢你提供的信息……因此,通过复制标签复制tiff图像并不像我想的那么简单。首先,你可以尝试将设置字段包装在一个try-catch块中,然后记录/写出失败的标签以进行检查,如果它们确实是伪标签。你的想法帮助我过滤了它们。所以,我还有一个问题。如何在我的图像中设置伪标记(压缩、光度控制、重新显示等)?我们应该全部手动设置吗?我还没有完全研究文档;从我读到的一点来看,我相信这些伪标记是只读的。我相信库例程创建它们是为了您的方便或内部使用,它们实际上不是tiff文件的一部分。所以你不能也不需要设置它们。它们的值可能来自其他标记或图像数据。
newiimage.SetField(tag, value.Select(v => v.Value).ToArray());