Использование 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.