Image 在C+中编写多页大Tiff保存+;
我正在编写一个应用程序来保存多页tiff保存,我在使用大tiff库时遇到两个问题:Image 在C+中编写多页大Tiff保存+;,image,save,tiff,geotiff,libtiff.net,Image,Save,Tiff,Geotiff,Libtiff.net,我正在编写一个应用程序来保存多页tiff保存,我在使用大tiff库时遇到两个问题: 到目前为止,我能够在一个堆栈中保存一些图像,但是使用我只能看到3或4个页面,即使图像堆栈的文件大小远远大于4个图像;我希望看到更多的图片。我仿效了这个例子 //打开 TIFFOpen(destPtr,“w8”); //设置 TIFFSetField(输出,TIFFTAG_图像宽度,宽度); TIFFSetField(输出、TIFFTAG_图像长度、高度); TIFFSetField(输出,TIFFTAG_位样本,
//打开
TIFFOpen(destPtr,“w8”);
//设置
TIFFSetField(输出,TIFFTAG_图像宽度,宽度);
TIFFSetField(输出、TIFFTAG_图像长度、高度);
TIFFSetField(输出,TIFFTAG_位样本,位样本);
TIFFSetField(输出、TIFFTAG_方向、方向_左上角);
TIFFSetField(输出,TIFFTAG_平面配置,平面配置_CONTIG);
TIFFSetField(输出,TIFFTAG\u压缩,压缩\u无)//任何一个都有效
TIFFSetField(输出,TIFFTAG_FILLORDER,FILLORDER_MSB2LSB);
TIFFSetField(out,TIFFTAG_ROWSPERSTRIP,8);
TIFFSetField(输出,TIFFTAG_光度计,光度计_黑色);
TIFFSetField(输出,TIFFTAG_SAMPLESPERPIXEL,1);
TIFFSetField(输出,TIFFTAG_MAXSAMPLEVALUE,MAXSAMPLEVALUE);
//环路
对于(int i=0;i
//open
TIFFOpen(destPtr, "w8");
//set
TIFFSetField(out, TIFFTAG_IMAGEWIDTH, width);
TIFFSetField(out, TIFFTAG_IMAGELENGTH, height);
TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, bitsPerSample);
TIFFSetField(out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
TIFFSetField(out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
TIFFSetField(out, TIFFTAG_COMPRESSION, COMPRESSION_NONE); //either one works
TIFFSetField(out, TIFFTAG_FILLORDER, FILLORDER_MSB2LSB);
TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, 8);
TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, 1);
TIFFSetField(out, TIFFTAG_MAXSAMPLEVALUE, maxSampleValue);
//loop
for (int i =0; i<=10; i++)
{
// stack
TIFFSetField(out, TIFFTAG_SUBFILETYPE, FILETYPE_PAGE);
// set the page number
TIFFSetField(out, TIFFTAG_PAGENUMBER, i, 10);
int width = 5056;
int height = 2960;
tdata_t l_buffer;
unsigned long l_buffer_size = width * 2;
l_buffer = _TIFFmalloc(l_buffer_size);
unsigned short *da = (unsigned short*)data;
for (int row = 0; row < height; row++)
{
memcpy(l_buffer, &da[row*width], l_buffer_size);
int ret = TIFFWriteScanline(out, l_buffer, row, 0);
if (ret == -1)
{
TIFFClose(out);
}
}
_TIFFfree(l_buffer);
}
//close
(void)TIFFClose(out);
//open
TIFFOpen(destPtr, "w8");
//set
TIFFSetField(out, TIFFTAG_IMAGEWIDTH, width);
TIFFSetField(out, TIFFTAG_IMAGELENGTH, height);
TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, bitsPerSample);
TIFFSetField(out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
TIFFSetField(out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
TIFFSetField(out, TIFFTAG_COMPRESSION, COMPRESSION_NONE); //either one works
TIFFSetField(out, TIFFTAG_FILLORDER, FILLORDER_MSB2LSB);
TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, 1);
TIFFSetField(out, TIFFTAG_MAXSAMPLEVALUE, maxSampleValue);
//loop
for (int i =0; i<=10; i++)
{
// stack
TIFFSetField(out, TIFFTAG_SUBFILETYPE, FILETYPE_PAGE);
// set the page number
TIFFSetField(out, TIFFTAG_PAGENUMBER, i, 10);
TIFFWriteRawStrip((TIFF*)out, (tstrip_t)0, (tdata_t)data, (tsize_t)length);
}
//close
(void)TIFFClose(out);
tif = TIFFOpen(destPtr, "w");
int npages = 10;
for (int i = 0; i < npages; i++)
{
TIFFSetField(tif, TIFFTAG_IMAGELENGTH, height);
TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width);
TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1);
TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 16);
TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 8);
TIFFSetField(tif, TIFFTAG_SUBFILETYPE, FILETYPE_PAGE);
TIFFSetField(tif, TIFFTAG_PAGENUMBER, i, npages);
// not sure if this is needed...
TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
TIFFSetField(tif, TIFFTAG_FILLORDER, FILLORDER_MSB2LSB);
TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
//TIFFSetField(tif, TIFFTAG_RESOLUTIONUNIT, RESUNIT_CENTIMETER);
//TIFFSetField(tif, TIFFTAG_XRESOLUTION, pixels_per_cm);
//TIFFSetField(tif, TIFFTAG_YRESOLUTION, pixels_per_cm);
//tdata_t l_buffer;
//unsigned long l_buffer_size = width * 2; // LINE buffer for 16bit
//l_buffer = _TIFFmalloc(l_buffer_size);
char*dat = (char*)data;
for (int row = 0; row < height; row++) {
//memcpy(l_buffer, &data[row*width], l_buffer_size);
int ret = TIFFWriteScanline(tif, dat + row * width * 2, row, 0);
if (ret == -1) {
TIFFClose(tif);
return -1;
}
}
TIFFWriteDirectory(tif);
}
//_TIFFfree(l_buffer);
TIFFClose(tif);