3

*.tif イメージをメモリにロードせずに、その一部をロードする方法。

大きな TIFF ファイルを扱う必要があります。(> 4 GB)。を使用してこのファイルを読み取ろうとし、バイトを画像に変換するためにBinaryReader使用しました。BitMiracle.LibTiff.Classicしかし、TIFF ファイルで特定のピクセルを読み取る方法の例は見つかりませんでした。

たぶん、このタスクの解決策があるかもしれません。

BigScan.tifファイルがあり、常に次のようになっているとしましょう。

Image Compression -  NONE
Pixel Order       -  Interleaved (RGBRGB)
Byte Order        -  IBM PC

私はいくつかの変数を持っています:

ImagePart with  User Defined Width
ImagePart with  User Define Height
ImagePArt with  User Defined Location

問題は、どうやってImagePartから取得できるBigScan.tifかということです。

ただし、(x,y) 座標を使用して "BigScan.tif" のピクセルの情報を読み取る機能があれば最適です。

BigScan.tifそのような関数を使用して、指定された場所からピクセルを読み取る必要があります。

public Color GetPixelColorFromTiffImage(string TiffFileName, int PixelPositionX, int PixelPositionY)
{
    //Some Code
   return returnedColor;
}

非常に奇妙ですが、サポートは私の疑問を解決しませんでした. 誰か知ってるかも。BitMiracle Samplesのコードのこの部分が、「-11512229」、「-11838376」などの「ラスター」配列番号に書き込まれたのはなぜですか。

 using (Tiff image = Tiff.Open(fullImageLocation, "r"))
        {

            // Find the width and height of the image
            FieldValue[] value = image.GetField(TiffTag.IMAGEWIDTH);
             width = value[0].ToInt();

            value = image.GetField(TiffTag.IMAGELENGTH);
            height = value[0].ToInt();

            int imageSize = height * width;
            int[] raster = new int[imageSize];


            // Read the image into the memory buffer
            if (!image.ReadRGBAImage(width, height, raster))
            {
                MessageBox.Show("Could not read image");

            }


            using (Bitmap btm = new Bitmap(200, 200))
            {
                for (int i = 0; i < btm.Width; ++i)
                    for (int j = 0; j < btm.Height; ++j)
                        btm.SetPixel(i, j, getSample(i + 330, j + 30, raster, width, height));

                ReternedBitmap = btm;
            }
        }//using    
4

1 に答える 1

0

あなたの質問は不明確です (少なくとも 2 つの異なる質問をします)。

大きな画像の一部をトリミングする必要がある場合は、次のことを行う必要があります。

  1. ソース画像の関連する各スキャンラインを読み取る
  2. そのスキャンラインの一部を新しい画像にコピーします。

特定の場所で単一のピクセルの色の値を取得する必要がある場合は、次のことを行う必要があります。

  1. 関連するスキャンラインを読み取る
  2. そのスキャンラインで関連するバイトを見つける
  3. それらのバイトをColor構造体などにパックします

画像のとの値を指定しなかったためPhotometric、正確に何を扱っているかを判断するのは困難です。BitsPerSampleSamplesPerPixel

ほとんどの場合、地理的画像に直面しています。もしそうなら、それらはおそらく RGB、24 ビット、タイル画像です。

タイル化された画像の場合、画像の小さな部分 (たとえば、256 x 256 ピクセル) のみを一度に読み取ることができます。しかし、それらが削除されたとしても、そのような画像の 1 つのスキャンラインは約 1 MB のメモリしか必要としません (219,000 ピクセル * ピクセルあたり 3 バイト)。そのような大きな画像を本当に処理する必要がある場合は、何もありません。

独自のパーサーを開発することはお勧めしません。TIFF 形式の基本だけを知っていると、それほど簡単ではありません。

于 2013-04-30T16:16:37.973 に答える