Ошибка в режиме добавления LibTiff.NET? - PullRequest
2 голосов
/ 20 марта 2012

В последнее время я начал использовать 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);
    }
}

После открытия я вижу в основномпустое белое изображение или несколько черных и белых линий вместо текста, который был там написан (мне не нужно читать \ писать теги для создания такого поведения).Я заметил, что это происходит, когда у изображения уже есть пользовательский тег (об этом в окне консоли выдается предупреждение) или один из тегов получил «неверное значение» (в этом случае в окне консоли указано «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

Буду признателен за любую предоставленную помощь.

1 Ответ

4 голосов
/ 22 марта 2012

Вы, вероятно, не должны использовать метод CheckpointDirectory для файлов, открытых в режиме добавления.Попробуйте вместо этого использовать метод RewriteDirectory .

Он перезапишет каталог, но вместо того, чтобы поместить его в старое местоположение (как это делает WriteDirectory ()), он поместит их в конецфайла, исправляя указатель из предыдущего каталога или заголовка файла, чтобы указать его новое местоположение. Это особенно важно в случаях, когда размер каталога и указанных данных вырос , поэтому он не помещается в пространство, доступное в старом местоположении.Обратите внимание, что это приведет к потере ранее использованного пространства каталога.

...