Вопрос

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

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

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

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

Это было полезно?

Решение

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

http://bitmiracle.com/libtiff/

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

Другие советы

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

Моим первоначальным решением было использовать обертку C#.NET для Libtiff DLL. Я нашел это на Libtiff ftp. Анкет Похоже, он содержит все важные методы библиотеки Либтифф. Он сохраняет память в неуправляемой памяти Либтифф; Это означает, что код 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, но это решение может быть правильным для других людей, поэтому я оставляю его на Stackoverflow.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top