2013-04-30 48 views
2

如何加載* .tif圖像的一部分而不將該圖像加載到內存中。如何在不將整個圖像加載到內存的情況下加載TIFF圖像的一部分?

我必須使用大的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 

的問題是,我怎麼能得到BigScan.tifImagePart

但是最好能夠用(x,y)座標系讀取「BigScan.tif」中像素的信息。

我需要在指定的地方讀取來自BigScan.tif像素,具有這樣的功能:

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

很奇怪,但是支持did`t unswer我quastion。可能有人知道它。爲什麼要將這部分代碼從BitMiracle Samples寫入'raster'數組編號,如「-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

這有幫助嗎? http://bitmiracle.com/libtiff/help/how-to-read-tiff-scanlines-in-a-random-fashion.aspx – 2013-04-30 09:32:07

+0

嗯,我看到了這個頁面。但我仍然想知道它是如何提供幫助的。如何使用它可以設置像素的位置,並從主tif文件中讀取數據? – 2013-04-30 10:56:49

+1

它允許您從圖像中讀取任意數量的scalines - 所以即使您必須採用全寬(x座標),您至少可以選擇一系列行(y座標) - 也許這有助於嗎? – 2013-04-30 11:22:17

回答

0

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

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

  1. 閱讀源圖像的每一個相關的掃描線
  2. 複製掃描線的一部分,以全新的形象。

如果你需要得到一個像素的顏色值在給定的位置不是再次,你需要:

  1. 閱讀相關的掃描線
  2. 找到相關的字節在掃描線
  3. 收拾那些字節轉換爲Color結構或任何其他

您沒有指定什麼是Photometric,BitsPerSampleSamplesPerPixel值,因此很難說出你究竟在處理什麼。

很可能,您正面臨着地理圖像。如果是這樣,他們可能是RGB,24bit,瓷磚圖像。

對於平鋪圖像,可以一次只讀取圖像的一小部分(比如256 x 256像素)。但即使它們被剝離,這種圖像的一條掃描線也只會佔用大約1 MB的內存(每個像素219 000個像素* 3個字節)。如果你真的需要處理如此大的圖像,那沒有什麼。

我不建議你嘗試開發自己的解析器。如果只知道關於TIFF格式的基本知識,那並不容易。

+0

非常感謝您的回答。你是對的,現在我在編寫自己的「開場白」時遇到了一些問題,因爲事實證明 - 我真的不知道文件的指定((。我只希望BitMiracle會幫助你,你能幫我寫嗎代碼的一部分?因爲它對於* .tiff文件來說真的很神奇。 – 2013-05-01 22:18:16

相關問題