使用 libtiff returns 一列在 C 中读取 .tif 图像
Reading .tif images in C using libtiff returns one column
我想使用 "libtiff" 库从“.tiff”图像读取 u8 位像素强度值。我遇到了这段代码并将其修改为根据需要读取 8 位值,并且 returns 仅对一列进行正确的值。
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <inttypes.h>
#include "tiffio.h"
#define imsize 286628
int count;
int count2;
uint8* im;
uint32 imagelength;
uint32 width;
int main(){
im = (uint8*)malloc(imsize*sizeof(uint8));
TIFF* tif = TIFFOpen("image1.tif", "r");
if (tif) {
tsize_t scanline;
tdata_t buf;
uint32 row;
uint32 col;
uint16 nsamples;
TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &nsamples);
TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &imagelength);
TIFFGetField(tif,TIFFTAG_IMAGEWIDTH,&width);
scanline = TIFFScanlineSize(tif);
buf = _TIFFmalloc(scanline);
uint8* data;
for (row = 0; row < imagelength; row++)
{
TIFFReadScanline(tif, buf, row,1);
count2++;
for (col = 0; col < scanline; col++)
data = (uint8*)buf;
//printf("%d\n",col); remains the same not incrementing
printf("%d ", *data);//printing for testing need only to copy to an array to access by index
im[count] = *data;
count++;
printf("\n");
}
printf("im[1]= %d\n im[2] = %d \n im[3] = %d \n im[286628] = %d\n",im[0],im[1],im[2],im[286627]);
_TIFFfree(buf);
TIFFClose(tif);
free(im);
}
printf("num of cols= %d\n",count);
printf("num of rows = %d\n",count2);//both counts print col size
printf("width = %d\n",width); //prints row size
return 0;
}
在嵌套的 forloop 中,如果我添加方括号,循环将遍历正确的像素数
(对于此示例,#of-pixels = 286628、547x524 图像),但值不正确。
如果我把括号去掉,我会得到正确的值,但对于第一列(只有 547 个值)。
需要进行哪些更改才能正确迭代所有像素?
注:
我正在尝试获得一个值为 matlabs "imread()"
的矩阵
在 col
循环中,每一列使用 data = (uint8*)buf;
做完全相同的事情,这似乎是 first 列的数据。该循环还缺少 {
大括号 }
.
移行
data = (uint8*)buf;
在列循环之外并在循环内递增它。
for (row = 0; row < imagelength; row++)
{
TIFFReadScanline(tif, buf, row,1);
count2++;
data = (uint8*)buf; // move up
for (col = 0; col < scanline; col++)
{ // add braces
printf("%d ", *data);
im[count] = *data;
count++;
data++; // increment buffer pointer
}
printf("\n");
}
我想使用 "libtiff" 库从“.tiff”图像读取 u8 位像素强度值。我遇到了这段代码并将其修改为根据需要读取 8 位值,并且 returns 仅对一列进行正确的值。
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <inttypes.h>
#include "tiffio.h"
#define imsize 286628
int count;
int count2;
uint8* im;
uint32 imagelength;
uint32 width;
int main(){
im = (uint8*)malloc(imsize*sizeof(uint8));
TIFF* tif = TIFFOpen("image1.tif", "r");
if (tif) {
tsize_t scanline;
tdata_t buf;
uint32 row;
uint32 col;
uint16 nsamples;
TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &nsamples);
TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &imagelength);
TIFFGetField(tif,TIFFTAG_IMAGEWIDTH,&width);
scanline = TIFFScanlineSize(tif);
buf = _TIFFmalloc(scanline);
uint8* data;
for (row = 0; row < imagelength; row++)
{
TIFFReadScanline(tif, buf, row,1);
count2++;
for (col = 0; col < scanline; col++)
data = (uint8*)buf;
//printf("%d\n",col); remains the same not incrementing
printf("%d ", *data);//printing for testing need only to copy to an array to access by index
im[count] = *data;
count++;
printf("\n");
}
printf("im[1]= %d\n im[2] = %d \n im[3] = %d \n im[286628] = %d\n",im[0],im[1],im[2],im[286627]);
_TIFFfree(buf);
TIFFClose(tif);
free(im);
}
printf("num of cols= %d\n",count);
printf("num of rows = %d\n",count2);//both counts print col size
printf("width = %d\n",width); //prints row size
return 0;
}
在嵌套的 forloop 中,如果我添加方括号,循环将遍历正确的像素数 (对于此示例,#of-pixels = 286628、547x524 图像),但值不正确。 如果我把括号去掉,我会得到正确的值,但对于第一列(只有 547 个值)。
需要进行哪些更改才能正确迭代所有像素?
注: 我正在尝试获得一个值为 matlabs "imread()"
的矩阵在 col
循环中,每一列使用 data = (uint8*)buf;
做完全相同的事情,这似乎是 first 列的数据。该循环还缺少 {
大括号 }
.
移行
data = (uint8*)buf;
在列循环之外并在循环内递增它。
for (row = 0; row < imagelength; row++)
{
TIFFReadScanline(tif, buf, row,1);
count2++;
data = (uint8*)buf; // move up
for (col = 0; col < scanline; col++)
{ // add braces
printf("%d ", *data);
im[count] = *data;
count++;
data++; // increment buffer pointer
}
printf("\n");
}