首页 文章

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

提问于
浏览
1

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

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++;
                    }
                }
        }

Update 1:

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

Update 2: 原始的tiff文件和编写片段代码后的tiff已被附加 . 为什么输出的tiff文件搞砸了?

Input tiff

Output tiff

1 回答

  • 1

    我添加了这行代码将像素值转换为浮点数,它工作正常 .

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

相关问题