Image 在C+中编写多页大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_位样本,

我正在编写一个应用程序来保存多页tiff保存,我在使用大tiff库时遇到两个问题:

  • 到目前为止,我能够在一个堆栈中保存一些图像,但是使用我只能看到3或4个页面,即使图像堆栈的文件大小远远大于4个图像;我希望看到更多的图片。我仿效了这个例子

    //打开
    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);