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

📄 tif_overview.c

📁 TIFF文件格式读取及生成的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
                nXSize = MIN(nOMult,nBlockXSize-i);                nYSize = MIN(nOMult,nBlockYSize-j);                TIFF_GetSourceSamples( padfSamples, pabySrc,                                        nPixelBytes, nSampleFormat,                                        nXSize, nYSize,                                        nPixelGroupBytes,                                        nPixelGroupBytes * nBlockXSize );                                dfTotal = 0;                for( iSample = 0; iSample < nXSize*nYSize; iSample++ )                {                    dfTotal += padfSamples[iSample];                }                TIFF_SetSample( pabyDst, nPixelBytes, nSampleFormat,                                 dfTotal / (nXSize*nYSize) );                pabySrc += nOMult * nPixelGroupBytes;                pabyDst += nPixelBytes;            }        }    }    free( padfSamples );}/************************************************************************//*                      TIFF_ProcessFullResBlock()                      *//*                                                                      *//*      Process one block of full res data, downsampling into each      *//*      of the overviews.                                               *//************************************************************************/void TIFF_ProcessFullResBlock( TIFF *hTIFF, int nPlanarConfig,                               int nOverviews, int * panOvList,                               int nBitsPerPixel,                                int nSamples, TIFFOvrCache ** papoRawBIs,                               int nSXOff, int nSYOff,                               unsigned char *pabySrcTile,                               int nBlockXSize, int nBlockYSize,                               int nSampleFormat, const char * pszResampling )    {    int		iOverview, iSample;    for( iSample = 0; iSample < nSamples; iSample++ )    {        /*         * We have to read a tile/strip for each sample for         * PLANARCONFIG_SEPARATE.  Otherwise, we just read all the samples         * at once when handling the first sample.         */        if( nPlanarConfig == PLANARCONFIG_SEPARATE || iSample == 0 )        {            if( TIFFIsTiled(hTIFF) )            {                TIFFReadEncodedTile( hTIFF,                                     TIFFComputeTile(hTIFF, nSXOff, nSYOff,                                                     0, (tsample_t)iSample ),                                     pabySrcTile,                                     TIFFTileSize(hTIFF));            }            else            {                TIFFReadEncodedStrip( hTIFF,                                      TIFFComputeStrip(hTIFF, nSYOff,                                                       (tsample_t) iSample),                                      pabySrcTile,                                      TIFFStripSize(hTIFF) );            }        }        /*                 * Loop over destination overview layers         */        for( iOverview = 0; iOverview < nOverviews; iOverview++ )        {            TIFFOvrCache *poRBI = papoRawBIs[iOverview];            unsigned char *pabyOTile;            int	nTXOff, nTYOff, nOXOff, nOYOff, nOMult;            int	nOBlockXSize = poRBI->nBlockXSize;            int	nOBlockYSize = poRBI->nBlockYSize;            int	nSkewBits, nSampleByteOffset;             /*             * Fetch the destination overview tile             */            nOMult = panOvList[iOverview];            nOXOff = (nSXOff/nOMult) / nOBlockXSize;            nOYOff = (nSYOff/nOMult) / nOBlockYSize;            pabyOTile = TIFFGetOvrBlock( poRBI, nOXOff, nOYOff, iSample );                            /*             * 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->nBlockXSize, poRBI->nBlockYSize,                             nTXOff, nTYOff,                             nOMult, nSampleFormat, pszResampling );#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( TIFF *hTIFF, int nOverviews, int * panOvList,                         int bUseSubIFDs, const char *pszResampleMethod,                         int (*pfnProgress)( double, void * ),                         void * pProgressData ){    TIFFOvrCache	**papoRawBIs;    uint32		nXSize, nYSize, nBlockXSize, nBlockYSize;    uint16		nBitsPerPixel, nPhotometric, nCompressFlag, nSamples,                        nPlanarConfig, nSampleFormat;    int			bTiled, nSXOff, nSYOff, i;    unsigned char	*pabySrcTile;    uint16		*panRedMap, *panGreenMap, *panBlueMap;    TIFFErrorHandler    pfnWarning;/* -------------------------------------------------------------------- *//*      Get the base raster size.                                       *//* -------------------------------------------------------------------- */    TIFFGetField( hTIFF, TIFFTAG_IMAGEWIDTH, &nXSize );    TIFFGetField( hTIFF, TIFFTAG_IMAGELENGTH, &nYSize );    TIFFGetField( hTIFF, TIFFTAG_BITSPERSAMPLE, &nBitsPerPixel );    TIFFGetField( hTIFF, TIFFTAG_SAMPLESPERPIXEL, &nSamples );    TIFFGetFieldDefaulted( hTIFF, TIFFTAG_PLANARCONFIG, &nPlanarConfig );    TIFFGetFieldDefaulted( hTIFF, TIFFTAG_PHOTOMETRIC, &nPhotometric );    TIFFGetFieldDefaulted( hTIFF, TIFFTAG_COMPRESSION, &nCompressFlag );    TIFFGetFieldDefaulted( hTIFF, TIFFTAG_SAMPLEFORMAT, &nSampleFormat );    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",                   TIFFFileName(hTIFF), nBitsPerPixel );        return;    }    /* -------------------------------------------------------------------- *//*      Turn off warnings to avoid alot of repeated warnings while      *//*      rereading directories.                                          *//* -------------------------------------------------------------------- */    pfnWarning = TIFFSetWarningHandler( NULL );/* -------------------------------------------------------------------- *//*      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;        int             nColorCount = 1 << nBitsPerPixel;        panRed2 = (uint16 *) _TIFFmalloc(2*nColorCount);        panGreen2 = (uint16 *) _TIFFmalloc(2*nColorCount);        panBlue2 = (uint16 *) _TIFFmalloc(2*nColorCount);        memcpy( panRed2, panRedMap, 2 * nColorCount );        memcpy( panGreen2, panGreenMap, 2 * nColorCount );        memcpy( panBlue2, panBlueMap, 2 * nColorCount );        panRedMap = panRed2;        panGreenMap = panGreen2;        panBlueMap = panBlue2;    }    else    {        panRedMap = panGreenMap = panBlueMap = NULL;    }        /* -------------------------------------------------------------------- *//*      Initialize overviews.                                           *//* -------------------------------------------------------------------- */    papoRawBIs = (TIFFOvrCache **) _TIFFmalloc(nOverviews*sizeof(void*));    for( i = 0; i < nOverviews; i++ )    {        int	nOXSize, nOYSize, nOBlockXSize, nOBlockYSize;        uint32  nDirOffset;        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);        }        nDirOffset = TIFF_WriteOverview( hTIFF, nOXSize, nOYSize,                                         nBitsPerPixel, nPlanarConfig,                                         nSamples, nOBlockXSize, nOBlockYSize,                                         bTiled, nCompressFlag, nPhotometric,                                         nSampleFormat,                                         panRedMap, panGreenMap, panBlueMap,                                         bUseSubIFDs );                papoRawBIs[i] = TIFFCreateOvrCache( hTIFF, nDirOffset );    }    if( panRedMap != NULL )    {        _TIFFfree( panRedMap );        _TIFFfree( panGreenMap );        _TIFFfree( panBlueMap );    }    /* -------------------------------------------------------------------- *//*      Allocate a buffer to hold a source block.                       *//* -------------------------------------------------------------------- */    if( bTiled )        pabySrcTile = (unsigned char *) _TIFFmalloc(TIFFTileSize(hTIFF));    else        pabySrcTile = (unsigned char *) _TIFFmalloc(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,                                      nSampleFormat, pszResampleMethod );        }    }    _TIFFfree( pabySrcTile );/* -------------------------------------------------------------------- *//*      Cleanup the rawblockedimage files.                              *//* -------------------------------------------------------------------- */    for( i = 0; i < nOverviews; i++ )    {        TIFFDestroyOvrCache( papoRawBIs[i] );    }    if( papoRawBIs != NULL )        _TIFFfree( papoRawBIs );    TIFFSetWarningHandler( pfnWarning );}

⌨️ 快捷键说明

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