我剛開始在我的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的冪,它甚至會變得更糟!
感謝Antti的回答,您的代碼讓我走向正確的方向,但請在第一篇文章中查看更新以查看最新的問題。 – TerraUnity
嗨 我也嘗試使用LibTiff從灰度tiff讀取像素值。網絡庫,但不知何故無法弄清楚 - 有沒有人有工作解決方案? 在Python rasterio庫中,有一個稱爲sample的函數,您可以傳遞柵格數據X和Y,並返回該像素的值。 任何幫助將不勝感激。 謝謝 –