我正在尝试使用Libtiff提取SVS文件的第一页。
SVS文件对此图像使用JPEG2000压缩。
我的计划是:
从SVS的第一页提取原始平铺,以及
使用OpenJPEG解码。
下面是我试图从SVS中提取的原始瓷砖。我只从152mbsvs文件中得到了一个43KB的输出文件(它无法提取原始平铺)。
我希望有人能告诉我如何从SVS文件中提取tiles。
int main()
{
const char* filename = "input.svs";
TIFF* tiff_in = TIFFOpen(filename, "r");
TIFF* tiff_out = TIFFOpen("output.raw", "w");
if (tiff_in) {
uint32 imageWidth, imageLength;
uint32 tileWidth, tileLength;
uint32 tileCount, tileByteCounts;
uint32 samplePerPixel, bitsPerSample;
uint32 orientation, planarConfig, photoMetric;
uint32 xResolution, yResolution;
uint32 x, y;
ttile_t tile;
// get fileds from the input file
TIFFGetField(tiff_in, TIFFTAG_IMAGEWIDTH, &imageWidth);
TIFFGetField(tiff_in, TIFFTAG_IMAGELENGTH, &imageLength);
TIFFGetField(tiff_in, TIFFTAG_TILEWIDTH, &tileWidth);
TIFFGetField(tiff_in, TIFFTAG_TILELENGTH, &tileLength);
TIFFGetField(tiff_in, TIFFTAG_SAMPLESPERPIXEL, &samplePerPixel);
TIFFGetField(tiff_in, TIFFTAG_BITSPERSAMPLE, &bitsPerSample);
TIFFGetField(tiff_in, TIFFTAG_TILEBYTECOUNTS, &tileByteCounts);
TIFFGetField(tiff_in, TIFFTAG_ORIENTATION, &orientation);
TIFFGetField(tiff_in, TIFFTAG_PLANARCONFIG, &planarConfig);
TIFFGetField(tiff_in, TIFFTAG_PHOTOMETRIC, &photoMetric);
TIFFGetField(tiff_in, TIFFTAG_XRESOLUTION, &xResolution);
TIFFGetField(tiff_in, TIFFTAG_YRESOLUTION, &yResolution);
// set files to the output file
TIFFSetField(tiff_out, TIFFTAG_IMAGEWIDTH, imageWidth);
TIFFSetField(tiff_out, TIFFTAG_IMAGELENGTH, imageLength);
TIFFSetField(tiff_out, TIFFTAG_TILEWIDTH, tileWidth);
TIFFSetField(tiff_out, TIFFTAG_TILELENGTH, tileLength);
TIFFSetField(tiff_out, TIFFTAG_SAMPLESPERPIXEL, samplePerPixel);
TIFFSetField(tiff_out, TIFFTAG_BITSPERSAMPLE, bitsPerSample);
TIFFSetField(tiff_out, TIFFTAG_PLANARCONFIG, planarConfig);
TIFFSetField(tiff_out, TIFFTAG_PHOTOMETRIC, photoMetric);
TIFFSetField(tiff_out, TIFFTAG_XRESOLUTION, xResolution);
TIFFSetField(tiff_out, TIFFTAG_YRESOLUTION, yResolution);
//TIFFSetField(tiff_out, TIFFTAG_ROWSPERSTRIP, 1);
tdata_t buf = _TIFFmalloc(TIFFTileSize(tiff_in));
for (int tile = 0; tile < TIFFNumberOfTiles(tiff_in); tile++)
{
TIFFReadRawTile(tiff_in, tile, buf, (tsize_t)-1);
TIFFWriteRawTile(tiff_out, tile, buf, (tsize_t)sizeof(buf));
}
_TIFFfree(buf);
TIFFClose(tiff_in);
TIFFClose(tiff_out);
}
return 0;
}
最佳答案
您正在写入每个8字节的平铺。sizeof(buf)
是指针的字节大小。您想使用实际读取的字节数,它由buf
返回:
tsize_t size = TIFFReadRawTile(tiff_in, tile, buf, (tsize_t)-1);
TIFFWriteRawTile(tiff_out, tile, buf, size);
注意,这里您将JPEG2000压缩数据复制到输出文件。您必须使用OpenJPEG解压缩这些数据,然后写入未压缩平铺大小的数据,在连续平面配置中为
TIFFReadRawTile
,在单独平面配置中为tileWidth * tileLength * samplePerPixel * bitsPerSample / 8
。使用
tileWidth * tileLength * bitsPerSample / 8
和TIFFGetField
时,需要检查返回值。如果发生错误,则返回0。不能依赖未正确读取的值。其他错误和警告通常打印到
TIFFSetField
。如果您是在Windows下开发,通常不会显示这些内容。我建议您查看stderr
和TIFFSetErrorHandler
,在这里设置适当的消息显示功能将在开发过程中为您提供极大的帮助。关于c - 从SVS文件中提取完整比例的图像,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53698754/