Написание многостраничного сохранения Big Tiff в C ++ - PullRequest
1 голос
/ 25 сентября 2019

Я пишу приложение для сохранения многостраничного сохранения TIFF с помощью Big TIFF , и у меня две проблемы с библиотекой TIFF:

  1. ПокаЯ могу сохранить некоторые изображения в стеке, но с средством просмотра изображений я могу видеть только 3 или 4 страницы, даже если размер файла для стека изображений намного больше, чем 4 изображения;Я ожидаю увидеть больше изображений.Я последовал примеру здесь .

    //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);
    
  2. Если я использую TIFFWriteRawStrip (), тогда на изображении есть смещение, и я не могу просмотреть все изображения, дажехотя стек, кажется, содержит все изображения.С обычной библиотекой TIFF этот код работал просто отлично.

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

введите описание изображения здесь


...