10

LibTiff を使用して非常に大きな TIFF ファイルにアクセスしたいと考えています。複数のページやタイルなどの機能が必要なので、LibTiff が正しい方法のようです。C# から LibTiff を使用する方法について誰か助けてもらえますか? 私はいくつかのリンクを見つけました (部分的なコードを含むblog.bee-ee のような. しかし、私はバージョンを取得する以上のことはできませんでした. FreeImageを見てきましたが、それは適切ではないことがわかりました (写真は約 800 MPixel 8 または 16 です)ビット グレースケール --> 800-1600 MByte) のサイズで、32 ビット環境ではメモリにロードできません)

私は C/C++ の経験は豊富ですが、C# はまだ経験がありません。ラッパーやヒントを手伝ってくれる人はいますか?

注: TIFF でピラミッド平面 (マルチ解像度) にアクセスするページと、一度に読み込まずに画像のさまざまな部分にすばやくアクセスできる 256x256 のタイルが必要です。

[編集] LibTIFF.NETソリューションは、私にとって最も実用的であると思われました。私は現在、それを製品開発に統合しています。これにより、管理されたメモリに出入りすることによる多くの頭痛の種がおそらく解消されます。「コールバック」機能はまだ試していませんが、.net の方法でうまく解決されているようです。stackoverflow のヘルプに感謝します [/編集]

4

3 に答える 3

7

LibTiff.Netを試すことができます。これは、マネージドC#を使用して記述されたLibTiffの無料のオープンソースバージョンです。私たちの実装のAPIは、元のAPIと非常によく似ています。

https://bitmiracle.com/libtiff/

リリースしたばかりなので、バグがあるかもしれません。ただし、完全なソースコードにはいくつかのテストが付属しているため、最も明らかなバグを修正する必要があります。

于 2010-01-13T10:11:38.530 に答える
4

WIC は、非常に大きな画像ファイルをサポートします。.NET フレームワークには、TiffBitmapDecoder という適切なラッパーがあります。

于 2010-01-11T12:51:07.030 に答える
1

私の最初の解決策は、LibTIFF DLL に C#.NET ラッパーを使用することでした。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);   
    }
}

ただし、LibTIFF の .NET ポートを使用しますが、この解決策は他の人にとっては適切な解決策かもしれないので、StackOverflow に残します。

于 2010-01-13T08:41:47.510 に答える