C# 使用Libtiff.Net读取32位灰度Tiff
我尝试读取一个32位灰度tiff文件,其中图像中的每个像素都包含一个浮点数。但在读取过程中,缓冲区阵列为每个像素包含4个值。例如[像素值=43.0-->像素的字节值={0,0,44,66}]。我无法理解浮点像素值和字节值之间的关系。我还使用缓冲区编写了图像,但输出图像的像素值是int值,如1073872896。如有任何建议,将不胜感激C# 使用Libtiff.Net读取32位灰度Tiff,c#,tiff,grayscale,libtiff.net,C#,Tiff,Grayscale,Libtiff.net,我尝试读取一个32位灰度tiff文件,其中图像中的每个像素都包含一个浮点数。但在读取过程中,缓冲区阵列为每个像素包含4个值。例如[像素值=43.0-->像素的字节值={0,0,44,66}]。我无法理解浮点像素值和字节值之间的关系。我还使用缓冲区编写了图像,但输出图像的像素值是int值,如1073872896。如有任何建议,将不胜感激 using (Tiff input = Tiff.Open(@"E:\Sample_04.tif", "r")) { //
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++;
}
}
}
使用(Tiff输入=Tiff.Open(@“E:\Sample_04.tif”,“r”))
{
//获取用于写入输出图像文件的属性
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.photomic)[0].ToInt();
int scanlineSize=input.scanlineSize();
字节[][]缓冲区=新字节[高度][];
对于(int i=0;i
更新1:
我使用c#中的BitConverter类发现了四个字节和像素值之间的关系,如下所示:
字节[]a={0,0,44,66}-->43=位转换器.ToSingle(a,0)和1110179840=位转换器.ToInt32(a,0)。看起来字节被转换为int32,现在的问题是如何将字节值转换为浮点值
更新2:
原始tiff文件和编写代码片段后的tiff已附加。为什么输出tiff文件会出错
我添加了这行代码,将像素值转换为浮点数,效果很好
output.SetField(TiffTag.SAMPLEFORMAT, SampleFormat.IEEEFP);
你怎么知道“图像中的每个像素都包含一个浮点数”?“pixel value=43.0”从何而来?是什么让您相信“输出图像的像素值是像1073872896这样的int值”?为了回答您的问题,我将tiff文件导入ArcMap以显示像素值及其数据类型。