C# から LibTiff を使用する (タイル化された TIFF イメージにアクセスするため)
-
19-09-2019 - |
質問
LibTiff を使用して非常に大きな TIFF ファイルにアクセスしたいと考えています。複数のページやタイルなどの機能が必要なので、LibTiff を使用するのが正しい方法のようです。C# から LibTiff を使用する方法について誰か助けてもらえますか?いくつかのリンクを見つけました(たとえば、 blog.bee-ee 部分的なコードが含まれていました。しかし、バージョンを取得する以上のことはできません。見てきました 無料画像 しかし、それは適切ではないことがわかりました(写真はおよそのものです)800 MP 8 または 16 ビット グレースケール --> 800 ~ 1600 MB) サイズで、32 ビット環境ではメモリにロードできません)
私は C/C++ の経験は豊富ですが、C# についてはまだ経験がありません。誰かがラッパーやヒントを手伝ってくれませんか?
注記:tiff 内のピラミッド面 (多重解像度) にアクセスするためのページと、画像を一度にロードせずに画像のさまざまな部分に高速にアクセスできる 256x256 のタイルが必要です。
[編集] リブTIFF.NET 私にとって、この解決策が最も現実的であるように思えました。私は現在、これを製品開発に統合しています。これにより、マネージド メモリへの出入りに伴う多くの頭痛の種がおそらく軽減されます。私はまだ「コールバック」機能を試していませんが、.net の方法でうまく解決できるようです。StackoverFlowの助けをありがとう[/編集
解決
LibTiff.Net を試してみてください。これは、マネージド C# を使用して作成された LibTiff の無料のオープン ソース バージョンです。私たちの実装の API は、元の API と非常によく似ています。
http://bitmiracle.com/libtiff/
リリースしたばかりなのでバグがあるかもしれません。ただし、完全なソース コードには多数のテストが含まれるため、明らかなバグのほとんどは修正される必要があります。
他のヒント
WIC は、非常に大きな画像ファイルをサポートします。.NET Framework には、このための優れたラッパーがあります。TiffBitmapDecoder。
私の最初の解決策は、LibTIFF DLL に C#.NET ラッパーを使用することでした。で見つけました libtiffftp. 。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);
}
}
ただし、私は LibTIFF の .NET ポートを使用しますが、この解決策は他の人にとって適切な解決策である可能性があるため、StackOverflow に残しておきます。