我最近开始使用LibTiff.NET来编写tiff IPTC标签,并在我这里的一些文件中发现了奇怪的行为。我正在使用LibTiff.NET二进制文件附带的示例代码,它可以在大多数图像中正常工作,但是有些文件在这些行之后会损坏图像数据:
class Program
{
private const TiffTag TIFFTAG_GDAL_METADATA = (TiffTag)42112;
private static Tiff.TiffExtendProc m_parentExtender;
public static void TagExtender(Tiff tif)
{
TiffFieldInfo[] tiffFieldInfo =
{
new TiffFieldInfo(TIFFTAG_GDAL_METADATA, -1, -1, TiffType.ASCII,
FieldBit.Custom, true, false, "GDALMetadata"),
};
tif.MergeFieldInfo(tiffFieldInfo, tiffFieldInfo.Length);
if (m_parentExtender != null)
m_parentExtender(tif);
}
public static void Main(string[] args)
{
// Register the extender callback
// It's a good idea to keep track of the previous tag extender (if any) so that we can call it
// from our extender allowing a chain of customizations to take effect.
m_parentExtender = Tiff.SetTagExtender(TagExtender);
string destFile = @"d:\00000641(tiffed).tif";
File.Copy(@"d:\00000641.tif", destFile);
//Console.WriteLine("Hello World!");
// TODO: Implement Functionality Here
using (Tiff image = Tiff.Open(destFile, "a"))
{
// we should rewind to first directory (first image) because of append mode
image.SetDirectory(0);
// set the custom tag
string value = "<GDALMetadata>\n<Item name=\"IMG_GUID\">" +
"817C0168-0688-45CD-B799-CF8C4DE9AB2B</Item>\n<Item" +
" name=\"LAYER_TYPE\" sample=\"0\">athematic</Item>\n</GDALMetadata>";
image.SetField(TIFFTAG_GDAL_METADATA, value);
// rewrites directory saving new tag
image.CheckpointDirectory();
}
// restore previous tag extender
Tiff.SetTagExtender(m_parentExtender);
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
打开后,我看到大多数空白的白色图像或多条黑白线而不是已经写入的文本(我不需要读取\ write标签来产生这种行为)。我注意到当图像已经有自定义标签(控制台窗口提醒它)或其中一个标签有“坏值”时会发生这种情况(控制台窗口在这种情况下表示'vsetfield:%pathToTiffFile%:错误值0表示“%TagName% “tag”)。
原始图片:http://dl.dropbox.com/u/1476402/00000641.tif
LibTiff.NET之后的图像:http://dl.dropbox.com/u/1476402/00000641%28tiffed%29.tif
如果有任何帮助,我将不胜感激。
答案 0 :(得分:4)
对于在附加模式下打开的文件,您可能不应该使用CheckpointDirectory
方法。请尝试使用RewriteDirectory方法。
它会重写目录,但不要把它放在旧的位置 location(如WriteDirectory()所示)它会将它们放在末尾 该文件,从前面的目录或文件中更正指针 标题指向它的新位置。 这一点尤其重要 在目录大小和指向数据的情况下 增长,因此它不适合旧位置的可用空间。 请注意,这将导致先前使用的丢失 目录空间。