Использование LibTiff из C# (для доступа к мозаичным изображениям TIFF)

Я хотел бы использовать LibTiff для доступа к очень большим файлам TIFF. Мне нужны такие функции, как несколько страниц и плиток, и поэтому LibTiff, кажется, является правильным решением. Кто-нибудь может мне помочь, как использовать LibTiff из C#? Я нашел несколько ссылок (например, blog.bee-ee, в которых содержался частичный код. Но я не мог выйти за рамки получения версии. Я смотрел на FreeImage, но нашел его не подходящим (изображения приблизительно 800 MPixel 8 или 16). бит в градациях серого -> 800-1600 МБ), и я не могу загрузить его в память в 32-битной среде)

Я очень опытный в C/C++, но еще не в C#. Может кто-нибудь помочь мне в обертке или какие-то подсказки?

Примечание. Мне нужны страницы для доступа к пирамидальным плоскостям (мульти-разрешения) в формате TIFF и плиткам размером 256x256 для быстрого доступа к различным частям изображения без одновременной загрузки.

[Edit] Решение LibTIFF.NET показалось мне наиболее практичным. Сейчас я интегрирую его в разработку продукта, и это, вероятно, избавит меня от головной боли при входе / выходе из управляемой памяти. Я еще не пробовал использовать функцию "обратного вызова", которая, похоже, решается с помощью.net. Спасибо за помощь по stackru [/Edit]

3 ответа

Решение

Вы можете попробовать наш LibTiff.Net. Это бесплатная версия LibTiff с открытым исходным кодом, написанная с использованием управляемого C#. API нашей реализации остался очень похожим на оригинальный.

http://bitmiracle.com/libtiff/

Мы только что выпустили его, поэтому могут быть ошибки. Но полный исходный код поставляется с рядом тестов, поэтому наиболее очевидные ошибки должны быть исправлены.

WIC обеспечивает поддержку очень больших файлов изображений. Для.NET Framework есть хорошая обертка для этого: TiffBitmapDecoder.

Первоначально я решил использовать оболочку C#.NET для библиотеки LibTIFF. Я нашел это на libtiff ftp. Кажется, он содержит все важные методы библиотеки LIBTiff. Он хранит память в неуправляемой памяти LibTIFF; это означает, что код C# должен знать об этом и копировать данные, когда он должен быть обработан в безопасном коде.

Мой "код чтения плитки", чтобы проверить это читать как

if (LibTIFF.IsTiled(tiff))
{
    if (LibTIFF.GetField(tiff, (int)TIFFTags.TIFFTAG_TILEWIDTH, out tileWidth) &&
        LibTIFF.GetField(tiff, (int)TIFFTags.TIFFTAG_TILELENGTH, out tileLength))
    {
        uint tiles = 0;
        IntPtr pTile = LibTIFF._malloc((int)(tileLength*tileWidth*bitsPerSample/2));
        for (uint y = 0; y < imageLength; y += tileLength)
        {
            for (uint x = 0; x < imageWidth; x += tileWidth)
            {
                LibTIFF.ReadTile(tiff, pTile, x, y, 0, 0);
                tiles++;
            }
        }                        
        LibTIFF._free(pTile);   
    }
}

Я пойду к.NET-порту LibTIFF, но это решение может быть правильным для других людей, поэтому я оставляю его на Stackru.

Другие вопросы по тегам