⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tif_overview.cpp

📁 GIS系统支持库Geospatial Data Abstraction Library代码.GDAL is a translator library for raster geospatial dat
💻 CPP
📖 第 1 页 / 共 2 页
字号:
                                     TIFFComputeTile(hTIFF, nSXOff, nSYOff,                                                     0, iSample ),                                     pabySrcTile,                                     TIFFTileSize(hTIFF));            }            else            {                TIFFReadEncodedStrip( hTIFF,                                      TIFFComputeStrip(hTIFF, nSYOff, iSample),                                      pabySrcTile,                                      TIFFStripSize(hTIFF) );            }        }        /*                 * Loop over destination overview layers         */        for( iOverview = 0; iOverview < nOverviews; iOverview++ )        {            RawBlockedImage *poRBI = papoRawBIs[iOverview*nSamples + iSample];            unsigned char *pabyOTile;            int	nTXOff, nTYOff, nOXOff, nOYOff, nOMult;            int	nOBlockXSize = poRBI->GetBlockXSize();            int	nOBlockYSize = poRBI->GetBlockYSize();            int	nSkewBits, nSampleByteOffset;             /*             * Fetch the destination overview tile             */            nOMult = panOvList[iOverview];            nOXOff = (nSXOff/nOMult) / nOBlockXSize;            nOYOff = (nSYOff/nOMult) / nOBlockYSize;            pabyOTile = poRBI->GetTileForUpdate( nOXOff, nOYOff );                            /*             * Establish the offset into this tile at which we should             * start placing data.             */            nTXOff = (nSXOff - nOXOff*nOMult*nOBlockXSize) / nOMult;            nTYOff = (nSYOff - nOYOff*nOMult*nOBlockYSize) / nOMult;            /*             * Figure out the skew (extra space between ``our samples'') and             * the byte offset to the first sample.             */            assert( (nBitsPerPixel % 8) == 0 );            if( nPlanarConfig == PLANARCONFIG_SEPARATE )            {                nSkewBits = 0;                nSampleByteOffset = 0;            }            else            {                nSkewBits = nBitsPerPixel * (nSamples-1);                nSampleByteOffset = (nBitsPerPixel/8) * iSample;            }                        /*             * Perform the downsampling.             */#ifdef DBMALLOC            malloc_chain_check( 1 );#endif            TIFF_DownSample( pabySrcTile + nSampleByteOffset,                             nBlockXSize, nBlockYSize,                             nSkewBits, nBitsPerPixel, pabyOTile,                             poRBI->GetBlockXSize(),                             poRBI->GetBlockYSize(),                             nTXOff, nTYOff,                             nOMult );#ifdef DBMALLOC            malloc_chain_check( 1 );#endif                    }    }}/************************************************************************//*                        TIFF_BuildOverviews()                         *//*                                                                      *//*      Build the requested list of overviews.  Overviews are           *//*      maintained in a bunch of temporary files and then these are     *//*      written back to the TIFF file.  Only one pass through the       *//*      source TIFF file is made for any number of output               *//*      overviews.                                                      *//************************************************************************/void TIFFBuildOverviews( const char * pszTIFFFilename,                         int nOverviews, int * panOvList,                         int bUseSubIFDs ){    RawBlockedImage	**papoRawBIs;    uint32		nXSize, nYSize, nBlockXSize, nBlockYSize;    uint16		nBitsPerPixel, nPhotometric, nCompressFlag, nSamples,                        nPlanarConfig;    int			bTiled, nSXOff, nSYOff, i, iSample;    unsigned char	*pabySrcTile;    TIFF		*hTIFF;    uint16		*panRedMap, *panGreenMap, *panBlueMap;/* -------------------------------------------------------------------- *//*      Get the base raster size.                                       *//* -------------------------------------------------------------------- */    hTIFF = TIFFOpen( pszTIFFFilename, "r" );    if( hTIFF == NULL )    {        fprintf( stderr, "TIFFOpen(%s) failed.\n", pszTIFFFilename );        exit( 1 );    }    TIFFGetField( hTIFF, TIFFTAG_IMAGEWIDTH, &nXSize );    TIFFGetField( hTIFF, TIFFTAG_IMAGELENGTH, &nYSize );    TIFFGetField( hTIFF, TIFFTAG_BITSPERSAMPLE, &nBitsPerPixel );    TIFFGetField( hTIFF, TIFFTAG_SAMPLESPERPIXEL, &nSamples );    TIFFGetField( hTIFF, TIFFTAG_PLANARCONFIG, &nPlanarConfig );    TIFFGetField( hTIFF, TIFFTAG_PHOTOMETRIC, &nPhotometric );    TIFFGetField( hTIFF, TIFFTAG_COMPRESSION, &nCompressFlag );    if( nBitsPerPixel < 8 )    {        TIFFError( "TIFFBuildOverviews",                   "File `%s' has samples of %d bits per sample.  Sample\n"                   "sizes of less than 8 bits per sample are not supported.\n",                   pszTIFFFilename, nBitsPerPixel );        return;    }    /* -------------------------------------------------------------------- *//*      Get the base raster block size.                                 *//* -------------------------------------------------------------------- */    if( TIFFGetField( hTIFF, TIFFTAG_ROWSPERSTRIP, &(nBlockYSize) ) )    {        nBlockXSize = nXSize;        bTiled = FALSE;    }    else    {        TIFFGetField( hTIFF, TIFFTAG_TILEWIDTH, &nBlockXSize );        TIFFGetField( hTIFF, TIFFTAG_TILELENGTH, &nBlockYSize );        bTiled = TRUE;    }/* -------------------------------------------------------------------- *//*	Capture the pallette if there is one.				*//* -------------------------------------------------------------------- */    if( TIFFGetField( hTIFF, TIFFTAG_COLORMAP,                      &panRedMap, &panGreenMap, &panBlueMap ) )    {        uint16		*panRed2, *panGreen2, *panBlue2;        panRed2 = (uint16 *) calloc(2,256);        panGreen2 = (uint16 *) calloc(2,256);        panBlue2 = (uint16 *) calloc(2,256);        memcpy( panRed2, panRedMap, 512 );        memcpy( panGreen2, panGreenMap, 512 );        memcpy( panBlue2, panBlueMap, 512 );        panRedMap = panRed2;        panGreenMap = panGreen2;        panBlueMap = panBlue2;    }    else    {        panRedMap = panGreenMap = panBlueMap = NULL;    }        /* -------------------------------------------------------------------- *//*      Initialize the overview raw layers                              *//* -------------------------------------------------------------------- */    papoRawBIs = (RawBlockedImage **)        calloc(nOverviews*nSamples,sizeof(void*));    for( i = 0; i < nOverviews; i++ )    {        int	nOXSize, nOYSize, nOBlockXSize, nOBlockYSize;        nOXSize = (nXSize + panOvList[i] - 1) / panOvList[i];        nOYSize = (nYSize + panOvList[i] - 1) / panOvList[i];        nOBlockXSize = MIN((int)nBlockXSize,nOXSize);        nOBlockYSize = MIN((int)nBlockYSize,nOYSize);        if( bTiled )        {            if( (nOBlockXSize % 16) != 0 )                nOBlockXSize = nOBlockXSize + 16 - (nOBlockXSize % 16);                        if( (nOBlockYSize % 16) != 0 )                nOBlockYSize = nOBlockYSize + 16 - (nOBlockYSize % 16);        }        for( iSample = 0; iSample < nSamples; iSample++ )        {            papoRawBIs[i*nSamples + iSample] =                new RawBlockedImage( nOXSize, nOYSize,                                     nOBlockXSize, nOBlockYSize,                                     nBitsPerPixel );        }    }/* -------------------------------------------------------------------- *//*      Allocate a buffer to hold a source block.                       *//* -------------------------------------------------------------------- */    if( bTiled )        pabySrcTile = (unsigned char *) malloc(TIFFTileSize(hTIFF));    else        pabySrcTile = (unsigned char *) malloc(TIFFStripSize(hTIFF));    /* -------------------------------------------------------------------- *//*      Loop over the source raster, applying data to the               *//*      destination raster.                                             *//* -------------------------------------------------------------------- */    for( nSYOff = 0; nSYOff < (int) nYSize; nSYOff += nBlockYSize )    {        for( nSXOff = 0; nSXOff < (int) nXSize; nSXOff += nBlockXSize )        {            /*             * Read and resample into the various overview images.             */                        TIFF_ProcessFullResBlock( hTIFF, nPlanarConfig,                                      nOverviews, panOvList,                                      nBitsPerPixel, nSamples, papoRawBIs,                                      nSXOff, nSYOff, pabySrcTile,                                      nBlockXSize, nBlockYSize );        }    }    free( pabySrcTile );    TIFFClose( hTIFF );/* ==================================================================== *//*      We now have the overview rasters built, and held as             *//*      RawBlockedImage's.  Now we need to write them to new TIFF       *//*      layers.                                                         *//* ==================================================================== */    hTIFF = TIFFOpen( pszTIFFFilename, "a" );    if( hTIFF == NULL )    {        fprintf( stderr,                 "TIFFOpen(%s,\"a\") failed.  No overviews written.\n"                 "Do you have write permissions on that file?\n",                 pszTIFFFilename );    }    else    {        for( i = 0; i < nOverviews; i++ )        {            TIFF_WriteOverview( hTIFF, nSamples, papoRawBIs + i*nSamples,                                bTiled, nCompressFlag, nPhotometric,                                panRedMap, panGreenMap, panBlueMap,                                bUseSubIFDs );        }                TIFFClose( hTIFF );    }    /* -------------------------------------------------------------------- *//*      Cleanup the rawblockedimage files.                              *//* -------------------------------------------------------------------- */    for( i = 0; i < nOverviews*nSamples; i++ )    {        delete papoRawBIs[i];    }    if( papoRawBIs != NULL )        free( papoRawBIs );    if( panRedMap != NULL )    {        free( panRedMap );        free( panGreenMap );        free( panBlueMap );    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -