簡體   English   中英

如何在不將整個圖像加載到內存的情況下加載TIFF圖像的一部分?

[英]How to load a part of a TIFF image without loading whole image into memory?

如何加載* .tif圖像的一部分而不將該圖像加載到內存中。

我必須處理大型TIFF文件。 (> 4 GB)。 我嘗試使用BinaryReaderBitMiracle.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

現在的問題是,我怎么能拿ImagePartBigScan.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    

您的問題不清楚(您至少要問兩個不同的問題)。

如果需要裁剪較大圖像的一部分,則需要:

  1. 讀取源圖像的​​每個相關掃描線
  2. 將該掃描線的一部分復制到新圖像。

如果您需要獲取給定位置中單個像素的顏色值,則需要再次:

  1. 閱讀相關的掃描線
  2. 在該掃描線中找到相關的字節
  3. 將這些字節打包成Color結構或其他任何形式

您沒有為圖像指定什么是PhotometricBitsPerSampleSamplesPerPixel值,因此很難說出您到底要處理什么。

您很可能會遇到地理圖像。 如果是這樣,它們可能是RGB,24位平鋪圖像。

對於平鋪圖像,可以一次只讀取圖像的一小部分(例如256 x 256像素)。 但是,即使將它們剝離,一條這樣的圖像的一條掃描線也將僅占用大約1 MB的內存(219 000像素*每個像素3個字節)。 如果您真的需要處理這么大的圖像,那沒什么。

我不建議您嘗試開發自己的解析器。 如果您僅了解有關TIFF格式的基礎知識,那並不是那么容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM