如何用geotiff解释geotiff strip数据

时间:2017-06-07 20:11:47

标签: c geotiff

我正在研究需要读取4通道地理图像的代码,在这种情况下是16位图像(数据实际上是12位分辨率,但是以16位编码)。

我的主要目标是读取像素值以便以后使用它们。 从这个问题"How 16bits-RGBA image pixels are interlaced?"我尝试使用TIFFReadEncodedStrip而不是像这样的TIFFRGBAImage:

buf = (unsigned char*)(_TIFFmalloc(TIFFStripSize(tif)));
TIFFReadEncodedStrip(tif,strip,buf,(tsize_t)-1);
uint32 *p0 = buf;
printf("strip %d = %d \n", strip, *p0);

对于我打印的p0值,应该是实际的图像数据,我得到了这个:

strip 0 = 20382000

检查我的图片中的标签我发现:

Rows per strip: 1  
Samples per pixel: 4  
Bits per sample: 16 
Image orientation: 1 (bottom left)  
Size of buffer: 8 bytes

所以我的假设是,我从缓冲区得到的p0值是图像第一个通道左上角的四个第一个像素。 我不明白的是我如何解释我得到的p0条的值。

在matlab中打开图像并检查每个通道中的第一个像素(左上角)我得到了304,311,314和314,它们似乎不是p0值上的任何东西我都是得到。

我不知道它是否因为12位分辨率,或者我必须将其转换为uint32以外的其他类型,但我无法理解数。

有人可以帮助破译这个数字,如果它对应左下角的前四个像素?

1 个答案:

答案 0 :(得分:0)

我可以使用以下代码访问图像中的实际像素值:

TIFFReadEncodedStrip(tif,strip,buf, (tsize_t) -1);  
uint16_t *p16;
p16 = (uint16_t *) buf;
printf("Strip: %d\n", strip);
int i = 0;
for (i; i < 64; i++) {      // the strip buffer is *length* elements long
    printf("%d: %u\n", i+1, p16[i]);
}

关键是将缓冲区转换为uint16_t*。这将像素值显示为人类可以理解的东西。