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'"
}
}
}
}
}
I am opening a file reading the tag values and writing them to another TIFF file. The problem occurs in the SetField function. I tried debugging it, everything seems fine, cant quite figure out, why it is throwing an error.
According to the Doc of the GetField method there are both real and pseudo-tags in its return set.
TiffTag.JPEGQUALITY is an example of a pseudo-tag.
You can't set the pseudo-tags, so you must exlude them from the write-loop.
The list of Well-known tags may help you to write a filter..
It may also be necessary to write out the tags that can't be written to make the filter more complete.
I do not know the precise nature of the pseudo-tag but given the openness of the tiff format, you are probably well-advised to include error handling for unexepected late-comers..