我刚开始在我的c#应用程序中使用LibTIFF.NET来读取Tiff图像,这些图像是从ArcGIS服务器获取的高度图。我需要做的就是用图像的像素值填充数组,以基于平滑渐变生成地形。图像是LZW压缩的32位灰度Tiff,其浮点像素值表示米的上升。

几天以来,我一直在努力返回正确的值,但是假设所有图片都是黑色或白色,我得到的只是“ 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网格
未打压:RawStripSize = ArraySize = 65536 = 256x256网格


必须为:RawStripSize = ArraySize = 4096 = 32x32网格

如您所见,LibTIFF跳过了一些行并给出了不相关的顺序,如果图像大小不是2的幂,甚至会变得更糟!

最佳答案

您的示例文件似乎是平铺的tiff而不是剥离的。控制台说:


  ElevationMap.tif:无法从平铺图像读取扫描线


我将您的代码更改为读取图块。这样看来它正在读取数据。

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

10-08 11:30