使用 Libtiff.Net 读取 32 位灰度 Tiff
Reading 32-bit grayscale Tiff using Libtiff.Net
我尝试读取一个 32 位灰度 tiff 文件,其中图像中的每个像素都包含一个浮点数。但是在读取过程中,缓冲区数组包含每个像素的 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 class 找到了四个字节与像素值之间的关系,如下所示:
byte[] a = { 0, 0, 44, 66 } --> 43 = BitConverter.ToSingle(a, 0) 和 1110179840 = BitConverter.ToInt32(a, 0)。似乎字节被转换为 int32,现在的问题是如何将字节值转换为浮点数?
更新二:
原来的tiff文件和写完snippet代码后的tiff已经attached.Why输出的tiff文件搞砸了吗?
我添加了这行代码来将像素值转换为浮点数,它工作正常。
output.SetField(TiffTag.SAMPLEFORMAT, SampleFormat.IEEEFP);
我尝试读取一个 32 位灰度 tiff 文件,其中图像中的每个像素都包含一个浮点数。但是在读取过程中,缓冲区数组包含每个像素的 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 class 找到了四个字节与像素值之间的关系,如下所示: byte[] a = { 0, 0, 44, 66 } --> 43 = BitConverter.ToSingle(a, 0) 和 1110179840 = BitConverter.ToInt32(a, 0)。似乎字节被转换为 int32,现在的问题是如何将字节值转换为浮点数?
更新二: 原来的tiff文件和写完snippet代码后的tiff已经attached.Why输出的tiff文件搞砸了吗?
我添加了这行代码来将像素值转换为浮点数,它工作正常。
output.SetField(TiffTag.SAMPLEFORMAT, SampleFormat.IEEEFP);