📄 tif_overview.cpp
字号:
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 + -