Использование Libtiff из C# (для доступа
-
19-09-2019 - |
Вопрос
Я хотел бы использовать 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.