2015-06-06 54 views
1

我剛開始在我的c#應用程序中使用LibTIFF.NET將Tiff圖像讀取爲從ArcGIS服務器獲取的heightmaps。我所需要的就是用基於平滑漸變的圖像像素值填充地形生成陣列。該圖像是LZW壓縮的32位灰度Tiff,浮點像素值表示以米爲單位的elevaion。32位灰度Tiff浮點數值使用LibTIFF.NET C#

現在已經有些日子,我努力恢復正確的值,但我得到的只是「0」值,假設它是全黑或白圖像!

這裏是到目前爲止的代碼:(更新 - 閱讀更新1)

using (Tiff inputImage = Tiff.Open(fileName, "r")) 
     { 
      int width = inputImage.GetField(TiffTag.IMAGEWIDTH)[0].ToInt(); 
      int height = inputImage.GetField(TiffTag.IMAGELENGTH)[0].ToInt(); 
      int bytesPerPixel = 4; 
      int count = (int)inputImage.RawTileSize(0); //Has to be: "width * height * bytesPerPixel" ? 
      int resolution = (int)Math.Sqrt(count); 
      byte[] inputImageData = new byte[count]; //Has to be: byte[] inputImageData = new byte[width * height * bytesPerPixel]; 
      int offset = 0; 

      for (int i = 0; i < inputImage.NumberOfTiles(); i++) 
      { 
       offset += inputImage.ReadEncodedTile(i, inputImageData, offset, (int)inputImage.RawTileSize(i)); 
      } 

      float[,] outputImageData = new float[resolution, resolution]; //Has to be: float[,] outputImageData = new float[width * height]; 
      int length = inputImageData.Length; 
      Buffer.BlockCopy(inputImageData, 0, outputImageData, 0, length); 

      using (StreamWriter sr = new StreamWriter(fileName.Replace(".tif", ".txt"))) { 
       string row = ""; 

       for(int i = 0; i < resolution; i++) { //Change "resolution" to "width" in order to have correct array size 
        for(int j = 0; j < resolution; j++) { //Change "resolution" to "height" in order to have correct array size 
         row += outputImageData[i, j] + " "; 
        } 
        sr.Write(row.Remove(row.Length - 1) + Environment.NewLine); 
        row = ""; 
       } 
      } 
     } 

示例文件&結果:http://terraunity.com/SampleElevationTiff_Results.zip

已經到處搜尋互聯網上,無法找到這一具體問題的解決方案。所以我非常感謝幫助他人的幫助。

更新1:

變化,按Antti Leppänen的答案代碼,但得到了奇怪的結果,這似乎是一個錯誤還是我失去了一些東西?請參閱上傳的ZIP文件,在這裏看到了新的32x32 TIFF圖像的結果:

http://terraunity.com/SampleElevationTiff_Results.zip

結果:

  • LZW壓縮:RawStripSize = ARRAYSIZE = 3081 = 55x55網格
  • Unompressed:RawStripSize = ArraySize = 65536 = 256x256 grid

必須是:RawStripSize = ArraySize = 4096 = 32x32 grid

當你看到結果時,LibTIFF會跳過一些行並給出不相關的排序,如果圖像大小不是2的冪,它甚至會變得更糟!

回答

0

您的示例文件似乎是平鋪tiff並沒有被剝離。控制檯說:

ElevationMap.tif:不能從一個平鋪圖像

我改變你的代碼讀取瓷磚閱讀掃描線。這種方式似乎在讀取數據。

for (int i = 0; i < inputImage.NumberOfTiles(); i++) 
{ 
    offset += inputImage.ReadEncodedTile(i, inputImageData, offset, (int)inputImage.RawTileSize(i)); 
} 
+0

感謝Antti的回答,您的代碼讓我走向正確的方向,但請在第一篇文章中查看更新以查看最新的問題。 – TerraUnity

+0

嗨 我也嘗試使用LibTiff從灰度tiff讀取像素值。網絡庫,但不知何故無法弄清楚 - 有沒有人有工作解決方案? 在Python rasterio庫中,有一個稱爲sample的函數,您可以傳遞柵格數據X和Y,並返回該像素的值。 任何幫助將不勝感激。 謝謝 –

0

我知道它可能會遲到,但最近我有同樣的錯誤,所以它可能會有所幫助。錯誤在功能Tiff.ReadEncodedTile(tile, buffer, offset, count)的參數count中。它必須是解壓縮的字節大小,而不是壓縮的字節大小。這就是爲什麼你沒有全部信息的原因,因爲你沒有將整個數據保存在緩衝區中。見how-to-translate-tiff-readencodedtile-to-elevation-terrain-matrix-from-height

相關問題