c# - 使用 Libtiff.Net 读取 32 位灰度 Tiff

标签 c# tiff grayscale libtiff.net

我尝试读取 32 位灰度 tiff 文件,图像中的每个像素都包含一个 float 。但在读取过程中,缓冲区数组包含每个像素的 4 个值。例如 [ 像素值 = 43.0 --> 像素的字节值 = {0 , 0 , 44 , 66} ]。我无法理解浮点像素值和字节值之间的关系。我还使用缓冲区编写了图像,但输出图像的像素值是 int 值,例如 1073872896。任何建议将不胜感激。

using (Tiff input = Tiff.Open(@"E:\Sample_04.tif", "r"))
        {
            // get properties to use in writing output image file
            int width = input.GetField(TiffTag.IMAGEWIDTH)[0].ToInt();
            int height = input.GetField(TiffTag.IMAGELENGTH)[0].ToInt();
            int samplesPerPixel = input.GetField(TiffTag.SAMPLESPERPIXEL)[0].ToInt();
            int bitsPerSample = input.GetField(TiffTag.BITSPERSAMPLE)[0].ToInt();
            int photo = input.GetField(TiffTag.PHOTOMETRIC)[0].ToInt();

            int scanlineSize = input.ScanlineSize();  
            byte[][] buffer = new byte[height][]; 

            for (int i = 0; i < height; i++)
            {
                buffer[i] = new byte[scanlineSize];
                input.ReadScanline(buffer[i], i);
            }

        using (Tiff output = Tiff.Open("output.tif", "w"))
                {
                    output.SetField(TiffTag.SAMPLESPERPIXEL, samplesPerPixel);
                    output.SetField(TiffTag.IMAGEWIDTH, width);
                    output.SetField(TiffTag.IMAGELENGTH, height);
                    output.SetField(TiffTag.BITSPERSAMPLE, bitsPerSample);
                    output.SetField(TiffTag.ROWSPERSTRIP, output.DefaultStripSize(0));
                    output.SetField(TiffTag.PHOTOMETRIC, photo);
                    output.SetField(TiffTag.PLANARCONFIG, PlanarConfig.CONTIG);
                    output.SetField(TiffTag.COMPRESSION, compression);

                    int j = 0;
                    for (int i = 0; i < h; i++)
                    {

                        output.WriteScanline(buffer[i], j);
                        j++;
                    }
                }
        }

更新1:

我使用c#中的BitConverter类发现了四个字节和像素值之间的关系,如下所示: byte[] a = { 0, 0, 44, 66 } --> 43 = BitConverter.ToSingle(a, 0) 和 1110179840 = BitConverter.ToInt32(a, 0)。看起来字节已转换为 int32,现在的问题是如何将字节值转换为 float ?

更新 2: 附上原始tiff文件和编写代码片段后的tiff。为什么输出的tiff文件是乱码?

Input tiff Output tiff

最佳答案

我添加了这行代码来将像素值转换为 float ,并且工作正常。

output.SetField(TiffTag.SAMPLEFORMAT, SampleFormat.IEEEFP);

关于c# - 使用 Libtiff.Net 读取 32 位灰度 Tiff,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43962213/

相关文章:

c# - 获取 viewmodel 属性的 modelstate 键

c++ - 使用 LibTIFF C++ 编写 10,12 位 TIFF 文件

linux - 从 linux 命令行将 PDF 转换为 GRAYSCALE 格式以供打印机使用

opencv - OpenCV中使用一张灰度图像(平面内)的二维直方图?

c# - 沙盒解决方案中的不良列表项提交逻辑

c# - LINQ to Entities无法识别: LastOrDefault [duplicate]方法

c# - 何时覆盖 ActionFilterAttribute.OnActionExecutingAsync()?

ios - UIimage 到 char* 转换

python - 查找 GeoTiff 图像中每个像素的纬度/经度坐标

c - 从图像 RGB bmp 纯 C 编写灰度 bmp 的这段代码有什么问题 - Windows 操作系统