Skip to content
Commits on Source (5)
//*******************************************************************
//
// License: LGPL
// License: MIT
//
// See LICENSE.txt file in the top level directory for more details.
//
......
OSSIM for Debian
----------------
The ossim subdirectory in the upstream tarball doesn't contain the
build system. This is included in the separate ossim_package_support
subdirectory which is excluded from the repacked upstream tarball.
When the ossim package is updated to a new upstream release, the cmake
patch needs to be updated to include the recent files from the
CMakeModules directory.
ossim (2.3.0-5) UNRELEASED; urgency=medium
ossim (2.3.1-1) unstable; urgency=medium
* Team upload.
* New upstream release.
* Update Vcs-* URLs for Salsa.
* Remove obsolete README.source.
-- Bas Couwenberg <sebastic@debian.org> Sat, 31 Mar 2018 12:39:53 +0200
-- Bas Couwenberg <sebastic@debian.org> Thu, 05 Apr 2018 07:22:08 +0200
ossim (2.3.0-4) unstable; urgency=medium
......
//----------------------------------------------------------------------------
//
// License: MIT
//
// See LICENSE.txt file in the top level directory for more details.
//
// Description: Factory class declaration for codec(encoder/decoder).
//
//----------------------------------------------------------------------------
// $Id$
#ifndef ossimNitfCodecFactory_HEADER
#define ossimNitfCodecFactory_HEADER
#include <ossim/imaging/ossimCodecBase.h>
#include <ossim/support_data/ossimNitfImageHeader.h>
#include <mutex>
/**
* This is a convenience class that is used by the NITF handler to create the proper keywordlist
* from the TREs and then calls the CodecRegistry to actuall return and allocate a new codec
*/
class ossimNitfCodecFactory
{
public:
~ossimNitfCodecFactory();
static ossimNitfCodecFactory* instance();
ossimCodecBase* createCodec(ossimRefPtr<ossimNitfImageHeader> imageHeader);
protected:
static std::mutex m_mutex;
static ossimNitfCodecFactory* m_instance;
ossimNitfCodecFactory();
};
#endif
......@@ -64,9 +64,9 @@ class JsonParam;
class OSSIM_DLL JsonConfig : public ossim::JsonInterface
{
public:
/** Default Ctor loads all default .json files in the share/ossim system dir */
JsonConfig();
/** Default Ctor loads all default .json files in the share/ossim system dir */
JsonConfig(const ossimFilename& configFile);
//! Destructor
......
......@@ -80,7 +80,7 @@ public:
virtual void initialize() {};
protected:
ossimPointBlock(const ossimPointBlock& rhs) {}
ossimPointBlock(const ossimPointBlock& /* rhs */) {}
void scanForMinMax() const;
ossimPointRecord m_nullPCR;
......
......@@ -33,6 +33,7 @@ class ossimFileWalker;
class ossimGpt;
class ossimPropertyInterface;
class ossimApplicationUsage;
class ossimImageHandler;
/**
* @brief ossimImageUtil class.
*
......@@ -112,6 +113,29 @@ public:
/** @return true if CREATE_OVERVIEWS_KW is found and set to true. */
bool createOverviews() const;
/**
* @brief Sets create thumbnails flag keyword CREATE_THUMBNAILS_KW used by
* processFile method.
*
* @param flag If true thumbnail will be created if image does not already.
*
* @note Overviews must be created before this works
*/
void setCreateThumbnailsFlag(bool flag);
/**
* @param value can be of values png or jpeg
*/
void setThumbnailType(const std::string& value);
/**
* @param value can be of values none,auto-minmax,auto-percentile,std-stretch-1,std-stretch-2,std-stretch-3
*/
void setThumbnailStretchType(const std::string& value);
/** @return true if CREATE_THUMBNAILS_KW is found and set to true. */
bool createThumbnails() const;
/**
* @brief Sets the rebuild overview flag keyword REBUILD_OVERVIEWS_KW used by
* processFile method.
......@@ -405,6 +429,8 @@ private:
bool useEntryIndex,
bool& consumedHistogramOptions);
void createThumbnail(ossimRefPtr<ossimImageHandler> &ih);
/** @return true if entry has required overviews. */
bool hasRequiredOverview( ossimRefPtr<ossimImageHandler>& ih,
ossimRefPtr<ossimOverviewBuilderBase>& ob );
......@@ -455,6 +481,12 @@ private:
/** @return the next reader prop index. */
ossim_uint32 getNextReaderPropIndex() const;
/** @return the next reader prop index. */
ossim_uint32 getThumbnailSize() const;
int getThumbnailStretchType()const;
std::string getThumbnailType()const;
std::string getThumbnailFilename(ossimImageHandler *ih) const;
/**
* @brief Adds option to m_kwl with mutex lock.
* @param key
......
......@@ -760,6 +760,11 @@ ossim.plugins.aws.s3.cacheInvalidLocations: true
//ossim.stream.factory.registry.istream.buffer1.size: 65536
// State cache settings
// ossim.imaging.handler.registry.state_cache.enabled: true or false
// ossim.imaging.handler.registry.state_cache.min_size: min number of items
// ossim.imaging.handler.registry.state_cache.max_size: max number of items
// Default the DES parser to true
des_parser: true
......
......@@ -417,10 +417,6 @@ ossimImageHandler* ossimImageHandlerFactory::open(const ossimKeywordlist& kwl,
result = new ossimQbTileFilesHandler;
if (result->loadState(kwl, prefix)) break;
if(traceDebug()) ossimNotify(ossimNotifyLevel_DEBUG)<<M<<"trying ossimQbTileFilesHandler...\n"<<std::endl;
result = new ossimQbTileFilesHandler;
if (result->loadState(kwl, prefix)) break;
if (traceDebug()) ossimNotify(ossimNotifyLevel_DEBUG)<<M<< "Trying band-separated files...\n";
result = new ossimBandSeparateHandler();
if (result->loadState(kwl, prefix)) break;
......
//----------------------------------------------------------------------------
//
// License: MIT
//
// See LICENSE.txt file in the top level directory for more details.
//
// Description: Factory class declaration for codec(encoder/decoder).
//
//----------------------------------------------------------------------------
// $Id$
#include <ossim/imaging/ossimNitfCodecFactory.h>
#include <ossim/imaging/ossimCodecFactoryRegistry.h>
ossimNitfCodecFactory* ossimNitfCodecFactory::m_instance=0;
std::mutex ossimNitfCodecFactory::m_mutex;
ossimNitfCodecFactory::ossimNitfCodecFactory()
{
m_instance = this;
}
ossimNitfCodecFactory::~ossimNitfCodecFactory()
{
std::lock_guard<std::mutex> lock(m_mutex);
m_instance = 0;
}
ossimNitfCodecFactory* ossimNitfCodecFactory::instance()
{
std::lock_guard<std::mutex> lock(m_mutex);
if(!m_instance)
{
m_instance = new ossimNitfCodecFactory();
}
return m_instance;
}
ossimCodecBase* ossimNitfCodecFactory::createCodec(ossimRefPtr<ossimNitfImageHeader> imageHeader)
{
ossimCodecBase* result=0;
if(imageHeader.valid()&&imageHeader->isCompressed())
{
ossimKeywordlist kwl;
imageHeader->saveState(kwl);
// rename the type to be a NITF IC compression type
// J2K should be C8
//
kwl.add("type", imageHeader->getCompressionCode().c_str(), true);
result = ossimCodecFactoryRegistry::instance()->createCodec(kwl);
}
return result;
}
......@@ -251,10 +251,6 @@ ossimIrect ossimScaleFilter::getBoundingRect(ossim_uint32 resLevel)const
if(!result.hasNans())
{
result = ossimIrect(result.ul().x,
result.ul().y,
result.lr().x+1,
result.lr().y+1);
result *= m_ScaleFactor;
}
......
......@@ -52,6 +52,16 @@
#include <ossim/projection/ossimProjectionFactoryRegistry.h>
#include <ossim/support_data/ossimSupportFilesList.h>
#include <ossim/util/ossimFileWalker.h>
#include <ossim/imaging/ossimBandSelector.h>
#include <ossim/imaging/ossimImageHistogramSource.h>
#include <ossim/imaging/ossimImageSourceFactoryRegistry.h>
#include <ossim/imaging/ossimImageRenderer.h>
#include <ossim/imaging/ossimScaleFilter.h>
#include <ossim/imaging/ossimImageWriterFactoryRegistry.h>
#include <ossim/imaging/ossimHistogramRemapper.h>
#include <ossim/imaging/ossimScalarRemapper.h>
#include <ossim/imaging/ossimRectangleCutFilter.h>
#include <ossim/projection/ossimImageViewAffineTransform.h>
#include <cstdlib>
#include <iomanip>
......@@ -66,6 +76,7 @@ static std::string CREATE_HISTOGRAM_KW = "create_histogram";
static std::string CREATE_HISTOGRAM_FAST_KW = "create_histogram_fast";
static std::string CREATE_HISTOGRAM_R0_KW = "create_histogram_r0";
static std::string CREATE_OVERVIEWS_KW = "create_overviews";
static std::string CREATE_THUMBNAILS_KW = "create_thumbnails";
static std::string DUMP_FILTERED_IMAGES_KW = "dump_filter_image";
static std::string FALSE_KW = "false";
static std::string FILE_KW = "file";
......@@ -81,6 +92,9 @@ static std::string REBUILD_OVERVIEWS_KW = "rebuild_overviews";
static std::string SCAN_MIN_MAX_KW = "scan_for_min_max";
static std::string SCAN_MIN_MAX_NULL_KW = "scan_for_min_max_null";
static std::string THREADS_KW = "threads";
static std::string THUMBNAIL_SIZE_KW = "thumbnail_size";
static std::string THUMBNAIL_STRETCH_TYPE_KW = "thumbnail_stretch_type";
static std::string THUMBNAIL_TYPE_KW = "thumbnail_type";
static std::string TILE_SIZE_KW = "tile_size";
static std::string TRUE_KW = "true";
static std::string WRITER_PROP_KW = "writer_prop";
......@@ -117,6 +131,9 @@ void ossimImageUtil::addOptions(ossimApplicationUsage* au)
au->addCommandLineOption("--ch or --create-histogram", "Computes full histogram alongside overview.");
au->addCommandLineOption("--chf or --create-histogram-fast", "Computes a histogram in fast mode which samples partial tiles.");
au->addCommandLineOption("--ct or --create-thumbnail", "computes a thumbnail of the image");
au->addCommandLineOption("--tt or --thumbnail-type", "Can be of of values png or jpeg");
au->addCommandLineOption("--tst or --thumbnail-stretch-type", "Can be of values none,auto-minmax,auto-percentile,std-stretch-1,std-stretch-2,std-stretch-3");
au->addCommandLineOption("--compression-quality", "Compression quality for TIFF JPEG takes values from 0 to 100, where 100 is best. For J2K plugin, numerically_lossless, visually_lossless, lossy");
......@@ -380,6 +397,30 @@ bool ossimImageUtil::initialize(ossimArgumentParser& ap)
break;
}
}
if (ap.read("--ct"))
{
setCreateThumbnailsFlag(true);
if (ap.argc() < 2)
{
break;
}
}
if (ap.read("--tt", sp1) || ap.read("--thumbnail-type", sp1))
{
setThumbnailType(ts1);
if (ap.argc() < 2)
{
break;
}
}
if (ap.read("--tst", sp1) || ap.read("--thumbnail-stretch-type", sp1))
{
setThumbnailStretchType(ts1);
if (ap.argc() < 2)
{
break;
}
}
if (ap.read("--ot", sp1))
{
......@@ -712,7 +753,19 @@ void ossimImageUtil::processFile(const ossimFilename& file)
createOverview(ih, consumedHistogramOptions, consumedCmmOptions);
}
}
if(createThumbnails())
{
for(ossim_uint32 idx = 0; idx < ih->getNumberOfEntries();++idx)
{
ih->setCurrentEntry(idx);
if(ih->getNumberOfDecimationLevels() <=1)
{
ih->getState()->setOverviewState(0);
ih->openOverview();
}
}
createThumbnail(ih);
}
// Build stand alone histogram. Note the overview sequencer may have computed for us.
if ( hasHistogramOption() && !consumedHistogramOptions)
{
......@@ -952,6 +1005,102 @@ void ossimImageUtil::createOverview(ossimRefPtr<ossimImageHandler>& ih,
ossimNotify(ossimNotifyLevel_DEBUG) << M << " exited...\n";
}
}
void ossimImageUtil::createThumbnail(ossimRefPtr<ossimImageHandler> &ih)
{
ossimKeywordlist bandsKeywordList;
bandsKeywordList.add("type", "ossimBandSelector");
bandsKeywordList.add(ossimKeywordNames::BANDS_KW, "default");
ossimRefPtr<ossimImageSource> bs = ossimImageSourceFactoryRegistry::instance()->createImageSource(bandsKeywordList);
if (!bs)
return;
ossimIrect cutRect;
ossimRefPtr<ossimImageRenderer> renderer = new ossimImageRenderer();
ossimRefPtr<ossimScalarRemapper> scalarRemapper = new ossimScalarRemapper();
ossimRefPtr<ossimRectangleCutFilter> cutFilter = new ossimRectangleCutFilter();
ossimRefPtr<ossimImageViewAffineTransform> trans = new ossimImageViewAffineTransform();
ossimDrect bounds = ih->getBoundingRect();
ossim_float64 maxSize = ossim::max(bounds.width(), bounds.height());
ossim_float64 thumbnailSize = getThumbnailSize();
ossim_float64 scale = thumbnailSize / maxSize;
ossimFilename thumbnailFilename = getThumbnailFilename(ih.get());
ossimHistogramRemapper::StretchMode thumbnailStretchType = static_cast<ossimHistogramRemapper::StretchMode> (getThumbnailStretchType());
if (scale > 1.0)
{
scale = 1.0;
cutRect = bounds;
}
else
{
cutRect = bounds * scale;
}
cutFilter->setRectangle(cutRect);
if ((scale < .5) && (ih->getNumberOfDecimationLevels() < 2))
{
return;
}
trans->scale(scale, scale);
renderer->setImageViewTransform(trans.get());
if (!bs.valid())
return;
bs->connectMyInputTo(ih.get());
bs->initialize();
ossim_uint32 bandCount = bs->getNumberOfInputBands();
if ((bandCount == 2) || (bandCount > 3))
{
ossimBandSelector *tempBs = dynamic_cast<ossimBandSelector *>(bs.get());
if (tempBs)
{
tempBs->setThreeBandRgb();
}
}
ossimRefPtr<ossimHistogramRemapper> stretch = new ossimHistogramRemapper();
stretch->setStretchMode(thumbnailStretchType);
ossimFilename histogramFilename = ih->createDefaultHistogramFilename();
//if (!histogramFilename.empty())
//{
// histogramFile = m_histogramFilename;
// }
stretch->connectMyInputTo(bs.get());
stretch->openHistogram(histogramFilename);
renderer->connectMyInputTo(stretch.get());
scalarRemapper->connectMyInputTo(renderer.get());
cutFilter->connectMyInputTo(scalarRemapper.get());
ossimKeywordlist writerKwl;
ossimString ext = thumbnailFilename.ext();
ext = ext.downcase();
writerKwl.add("type", "image/" + ext);
writerKwl.add("filename", thumbnailFilename.c_str());
writerKwl.add("create_external_geometry", "false");
if (ext == "png")
{
writerKwl.add("add_alpha_channel", "true");
}
ossimRefPtr<ossimImageFileWriter> writer = ossimImageWriterFactoryRegistry::instance()->createWriter(writerKwl);
if (writer)
{
writer->connectMyInputTo(cutFilter.get());
writer->execute();
writer->disconnect();
writer = 0;
}
scalarRemapper->disconnect();
scalarRemapper = 0;
cutFilter->disconnect();
cutFilter = 0;
renderer->disconnect();
renderer = 0;
stretch->disconnect();
stretch = 0;
bs->disconnect();
bs = 0;
}
bool ossimImageUtil::hasRequiredOverview( ossimRefPtr<ossimImageHandler>& ih,
ossimRefPtr<ossimOverviewBuilderBase>& ob )
......@@ -1512,6 +1661,15 @@ bool ossimImageUtil::createOverviews() const
{
return keyIsTrue( CREATE_OVERVIEWS_KW );
}
void ossimImageUtil::setCreateThumbnailsFlag(bool flag)
{
addOption(CREATE_THUMBNAILS_KW, (flag ? TRUE_KW : FALSE_KW));
}
bool ossimImageUtil::createThumbnails() const
{
return keyIsTrue(CREATE_THUMBNAILS_KW);
}
void ossimImageUtil::setRebuildOverviewsFlag( bool flag )
{
......@@ -1924,6 +2082,102 @@ ossim_uint32 ossimImageUtil::getNextReaderPropIndex() const
}
return result;
}
ossim_uint32 ossimImageUtil::getThumbnailSize() const
{
ossim_uint32 result;
std::string lookup = m_kwl->findKey(THUMBNAIL_SIZE_KW);
if (lookup.size())
{
result = ossimString(lookup).toUInt32();
}
else
{
result = 256;
}
return result;
}
void ossimImageUtil::setThumbnailStretchType(const std::string &value)
{
addOption(THUMBNAIL_STRETCH_TYPE_KW, value);
}
int ossimImageUtil::getThumbnailStretchType()const
{
int result = ossimHistogramRemapper::LINEAR_AUTO_MIN_MAX;
ossimString typeString = m_kwl->findKey(THUMBNAIL_STRETCH_TYPE_KW);
if (typeString.empty())
{
typeString = "auto-minmax";
}
typeString = typeString.downcase();
if ((typeString == "auto-minmax"))
{
result = ossimHistogramRemapper::StretchMode::LINEAR_AUTO_MIN_MAX;
}
else if ((typeString == "auto-percentile"))
{
result = ossimHistogramRemapper::StretchMode::LINEAR_AUTO_PERCENTILE;
}
else if ((typeString == "std-stretch-1") || (typeString == "std-stretch 1"))
{
result = ossimHistogramRemapper::StretchMode::LINEAR_1STD_FROM_MEAN;
}
else if ((typeString == "std-stretch-2") || (typeString == "std-stretch 2"))
{
result = ossimHistogramRemapper::StretchMode::LINEAR_2STD_FROM_MEAN;
}
else if ((typeString == "std-stretch-3") || (typeString == "std-stretch 3"))
{
result = ossimHistogramRemapper::StretchMode::LINEAR_3STD_FROM_MEAN;
}
else if (typeString == "auto-minmax")
{
result = ossimHistogramRemapper::StretchMode::STRETCH_UNKNOWN;
}
return result;
}
void ossimImageUtil::setThumbnailType(const std::string& value)
{
addOption(THUMBNAIL_TYPE_KW, value);
}
std::string ossimImageUtil::getThumbnailType() const
{
ossimString typeString = m_kwl->findKey(THUMBNAIL_TYPE_KW);
std::string result = "jpeg";
typeString = typeString.downcase();
if(typeString != "png" && typeString != "jpeg")
{
typeString = "jpeg";
}
result = typeString.string();
return result;
}
std::string ossimImageUtil::getThumbnailFilename(ossimImageHandler* ih) const
{
ossimFilename thumbnailFilename = ih->getFilenameWithThisExtension("");
std::string thumbnailType = getThumbnailType();
if (thumbnailType == "png")
{
thumbnailFilename = ossimFilename(thumbnailFilename + "thumb.png");
}
else
{
thumbnailFilename = ossimFilename(thumbnailFilename + "thumb.jpg");
}
return thumbnailFilename.string();
}
void ossimImageUtil::addOption(const std::string &key, ossim_uint32 value)
{
......
......@@ -86,6 +86,7 @@
#include <ossim/projection/ossimUtmProjection.h>
#include <ossim/support_data/ossimSrcRecord.h>
#include <ossim/support_data/ossimNitfFile.h>
#include <ossim/support_data/ossimWkt.h>
#include <ossim/base/Barrier.h>
......@@ -93,10 +94,12 @@
#include <ossim/base/Thread.h>
#include <ossim/support_data/TiffHandlerState.h>
#include <ossim/support_data/ImageHandlerStateRegistry.h>
// Put your includes here:
#include <ossim/imaging/ossimNitfCodecFactory.h>
#include <ossim/projection/ossimNitfRpcModel.h>
#include <ossim/projection/ossimQuickbirdRpcModel.h>
#include <ossim/imaging/ossimNitfCodecFactory.h>
// Put your includes here:
int main(int argc, char *argv[])
{
......@@ -110,55 +113,25 @@ int main(int argc, char *argv[])
try
{
ossimImageHandlerRegistry* handlerReg = ossimImageHandlerRegistry::instance();
ossimProjectionFactoryRegistry* projReg = ossimProjectionFactoryRegistry::instance();
// Open the image and fetch the geometry via the plugin:
ossimRefPtr<ossimImageHandler> pluginHandler = handlerReg->open(fname, true, false);
ossimRefPtr<ossimImageGeometry> pluginGeom = pluginHandler->getImageGeometry();
cout<<"pluginGeom's projection: "<<pluginGeom->getProjection()->getClassName()<<endl;
// NITF:
ossimRefPtr<ossimNitfRpcModel> nitfProj = new ossimNitfRpcModel(fname);
ossimRefPtr<ossimImageGeometry> nitfGeom = new ossimImageGeometry(0, nitfProj.get());
cout<<"NITF projection: "<<nitfProj->getClassName()<<endl;
// QB:
ossimRefPtr<ossimQuickbirdRpcModel> dgqbProj = new ossimQuickbirdRpcModel();
dgqbProj->parseFile(fname);
ossimRefPtr<ossimImageGeometry> dgqbGeom = new ossimImageGeometry(0, dgqbProj.get());
cout<<"DG/QB projection: "<<dgqbProj->getClassName()<<endl;
// Establish even image point distribution:
ossimIrect imageRect;
pluginGeom->getBoundingRect(imageRect);
int dx = (imageRect.width()-1)/2;
int dy = (imageRect.height()-1)/2;
ossimGpt pluginGpt, nitfGpt, dgqbGpt;
ossimDpt ip0;
double nitfDist, dgqbDist;
// Compute residual error between models:
for (int Y=0; Y<3; Y++)
{
ip0.y = dy*Y;
for (int X=0; X<3; X++)
{
ip0.x = dx*X;
pluginGeom->localToWorld(ip0, 0, pluginGpt);
ossimRefPtr<ossimNitfFile> file = new ossimNitfFile();
nitfGeom->localToWorld(ip0, 0, nitfGpt);
nitfDist = pluginGpt.distanceTo(nitfGpt);
dgqbGeom->localToWorld(ip0, 0, dgqbGpt);
dgqbDist = pluginGpt.distanceTo(dgqbGpt);
if(file->parseFile(ossimFilename(argv[1])))
{
ossimRefPtr<ossimNitfImageHeader> imageHeader = file->getNewImageHeader(0);
cout <<"\nGround residuals for image point "<<ip0<<":"
<<"\n NITF: "<<nitfDist<<" m"
<<"\n DGQB: "<<dgqbDist<<" m"<<endl;
if(imageHeader.valid())
{
ossimRefPtr<ossimCodecBase> codec = ossimNitfCodecFactory::instance()->createCodec(imageHeader);
if(codec.valid())
{
std::cout << "WE WERE ABLE TO ALLOCATE A CODEC!!!!!!\n";
}
}
}
}
catch(const ossimException& e)
{
ossimNotify(ossimNotifyLevel_WARN) << e.what() << std::endl;
......