// Create histogram for entry: void ossimImageUtil::createHistogram(ossimRefPtr<ossimImageHandler>& ih, ossim_uint32 entry, bool useEntryIndex) { static const char M[] = "ossimImageUtil::createHistogram #2"; if(traceDebug()) { ossimNotify(ossimNotifyLevel_DEBUG) << M << " entered...\n"; } if ( ih.valid() ) { if (useEntryIndex) { // Set entry before deriving file name. ih->setCurrentEntry(entry); ossimNotify(ossimNotifyLevel_NOTICE) << "entry number: "<< entry << std::endl; } ossimFilename outputFile = ih->getFilenameWithThisExtension(ossimString(".his"), useEntryIndex); // Only build if needed: if ( (outputFile.exists() == false) || rebuildHistogram() ) { ossimNotify(ossimNotifyLevel_NOTICE) << "Computing histogram for file: " << ih->getFilename() << std::endl; // Check handler to see if it's filtering bands. std::vector<ossim_uint32> originalBandList(0); if ( ih->isBandSelector() ) { // Capture for finalize method. ih->getOutputBandList( originalBandList ); // Set output list to input. ih->setOutputToInputBandList(); } ossimRefPtr<ossimImageHistogramSource> histoSource = new ossimImageHistogramSource; ossimRefPtr<ossimHistogramWriter> writer = new ossimHistogramWriter; histoSource->setMaxNumberOfRLevels(1); // Currently hard coded... #if 0 /* TODO tmp drb */ if( !ossim::isnan(histoMin) ) { histoSource->setMinValueOverride(histoMin); } if( !ossim::isnan(histoMax) ) { histoSource->setMaxValueOverride(histoMax); } if(histoBins > 0) { histoSource->setNumberOfBinsOverride(histoBins); } #endif if(traceDebug()) { ossimNotify(ossimNotifyLevel_DEBUG) << "Histogram mode: " << getHistogramMode() << "\n"; } // Connect histogram source to image handler. histoSource->setComputationMode( getHistogramMode() ); histoSource->connectMyInputTo(0, ih.get() ); histoSource->enableSource(); // Connect writer to histogram source. writer->connectMyInputTo(0, histoSource.get()); writer->setFilename(outputFile); theStdOutProgress.setFlushStreamFlag(true); writer->addListener(&theStdOutProgress); // Compute... writer->execute(); writer=0; // Reset the band list. if ( ih->isBandSelector() && originalBandList.size() ) { ih->setOutputBandList( originalBandList ); } } // Matches: if ( (outputFile.exists() == false) || rebuildHistogram() ) } // Matches: if ( ih.valid() ) if(traceDebug()) { ossimNotify(ossimNotifyLevel_DEBUG) << M << " exited...\n"; } } // End: ossimImageUtil::createHistogram #2
// Create overview for entry: void ossimImageUtil::createOverview(ossimRefPtr<ossimImageHandler>& ih, ossimRefPtr<ossimOverviewBuilderBase>& ob, ossim_uint32 entry, bool useEntryIndex, bool& consumedHistogramOptions) { static const char M[] = "ossimImageUtil::createOverview #2"; if(traceDebug()) { ossimNotify(ossimNotifyLevel_DEBUG) << M << " entered...\n"; } if ( ih.valid() && ob.valid() ) { if (useEntryIndex) { // Set entry before deriving file name. ih->setCurrentEntry(entry); ossimNotify(ossimNotifyLevel_NOTICE) << "entry number: "<< entry << std::endl; } ossimFilename outputFile = ih->getFilenameWithThisExtension(ossimString(".ovr"), useEntryIndex); if ( rebuildOverviews() ) { ih->closeOverview(); if ( outputFile.exists() ) { outputFile.remove(); } } if ( getInternalOverviewsFlag() ) { if ( ih->getClassName() == "ossimTiffTileSource") { //--- // INTERNAL_OVERVIEWS_FLAG_KW is set to true: // Tiff reader can handle internal overviews. Set the output file to // input file. Do it after the above remove so that if there were // external overviews they will get removed. //--- outputFile = ih->getFilename(); } else { ossimNotify(ossimNotifyLevel_NOTICE) << "Internal overviews not supported for reader type: " <<ih->getClassName() << "\nIgnoring option..." << endl; } } if ( hasRequiredOverview( ih, ob ) == false ) { //--- // Set create histogram code... // // Notes: // 1) Must put this logic after any removal of external overview file. // // 2) Base file could have built in overviews, e.g. jp2 files. So the sequensor could // start at R6 even if there is no external overview file. // // 3) If user want the histogram from R0 the overview builder can do as long as // ossimImageHandler::getNumberOfDecimationLevels returns 1. If we are starting // overview building at R6 then we must do the create histogram in a separate path. //--- ossimHistogramMode histoMode = OSSIM_HISTO_MODE_UNKNOWN; if ( createHistogram() || ( createHistogramR0() && ( ih->getNumberOfDecimationLevels() == 1 ) ) ) { histoMode = OSSIM_HISTO_MODE_NORMAL; } else if ( createHistogramFast() ) { histoMode = OSSIM_HISTO_MODE_FAST; } if(traceDebug()) { ossimNotify(ossimNotifyLevel_DEBUG) << "Histogram mode: " << histoMode << "\n"; } if ( histoMode != OSSIM_HISTO_MODE_UNKNOWN ) { consumedHistogramOptions = true; ob->setHistogramMode(histoMode); ossimNotify(ossimNotifyLevel_NOTICE) << "Creating overviews with histogram for file: " << ih->getFilename() << std::endl; } else { if ( histoMode != OSSIM_HISTO_MODE_UNKNOWN ) { consumedHistogramOptions = false; ossimNotify(ossimNotifyLevel_NOTICE) << "Creating overviews for file: " << ih->getFilename() << std::endl; } } ob->setOutputFile(outputFile); ob->setInputSource(ih.get()); // Create the overview for this entry in this file: if ( ob->execute() == false ) { setErrorStatus( ossimErrorCodes::OSSIM_ERROR ); ossimNotify(ossimNotifyLevel_WARN) << "Error returned creating overviews for file: " << ih->getFilename() << std::endl; } } else { consumedHistogramOptions = false; ossimNotify(ossimNotifyLevel_NOTICE) << "Image has required reduced resolution data sets." << std::endl; } } if(traceDebug()) { ossimNotify(ossimNotifyLevel_DEBUG) << M << " exited...\n"; } }