29 #include <QDomDocument>
30 #include <QDomElement>
33 : mContrastEnhancementAlgorithm( NoEnhancement )
34 , mContrastEnhancementFunction( nullptr )
35 , mEnhancementDirty( false )
36 , mLookupTable( nullptr )
37 , mRasterDataType( theDataType )
41 mRasterDataTypeRange = mMaximumValue - mMinimumValue;
43 mLookupTableOffset = mMinimumValue * -1;
48 if ( mRasterDataTypeRange <= 65535.0 )
50 mLookupTable =
new int[static_cast <
int>( mRasterDataTypeRange+1 )];
56 : mContrastEnhancementFunction( nullptr )
57 , mEnhancementDirty( true )
58 , mLookupTable( nullptr )
59 , mMinimumValue( ce.mMinimumValue )
60 , mMaximumValue( ce.mMaximumValue )
61 , mRasterDataType( ce.mRasterDataType )
62 , mRasterDataTypeRange( ce.mRasterDataTypeRange )
70 if ( mRasterDataTypeRange <= 65535.0 )
72 mLookupTable =
new int[static_cast <
int>( mRasterDataTypeRange+1 )];
78 delete [] mLookupTable;
79 delete mContrastEnhancementFunction;
92 switch ( theDataType )
130 switch ( theDataType )
176 if ( mEnhancementDirty )
178 generateLookupTable();
181 if ( mLookupTable &&
NoEnhancement != mContrastEnhancementAlgorithm )
183 return mLookupTable[static_cast <
int>( theValue + mLookupTableOffset )];
190 return mContrastEnhancementFunction->
enhance( theValue );
197 bool QgsContrastEnhancement::generateLookupTable()
199 mEnhancementDirty =
false;
201 if ( !mContrastEnhancementFunction )
216 for (
int myIterator = 0; myIterator <= mRasterDataTypeRange; myIterator++ )
218 mLookupTable[myIterator] = mContrastEnhancementFunction->
enhance( static_cast< double >( myIterator ) - mLookupTableOffset );
231 if ( mContrastEnhancementFunction )
247 switch ( theAlgorithm )
250 delete mContrastEnhancementFunction;
254 delete mContrastEnhancementFunction;
258 delete mContrastEnhancementFunction;
265 delete mContrastEnhancementFunction;
270 mEnhancementDirty =
true;
271 mContrastEnhancementAlgorithm = theAlgorithm;
275 generateLookupTable();
290 delete mContrastEnhancementFunction;
291 mContrastEnhancementFunction = theFunction;
293 generateLookupTable();
313 mMaximumValue = theValue;
316 if ( mContrastEnhancementFunction )
321 mEnhancementDirty =
true;
325 generateLookupTable();
345 mMinimumValue = theValue;
348 if ( mContrastEnhancementFunction )
353 mEnhancementDirty =
true;
357 generateLookupTable();
385 if ( !minValueElem.
isNull() )
390 if ( !maxValueElem.
isNull() )
395 if ( !algorithmElem.
isNull() )
400 if ( algorithmString ==
"0" )
404 else if ( algorithmString ==
"1" )
408 else if ( algorithmString ==
"2" )
412 else if ( algorithmString ==
"3" )
416 else if ( algorithmString ==
"4" )
434 return "NoEnhancement";
436 return "StretchToMinimumMaximum";
438 return "StretchAndClipToMinimumMaximum";
440 return "ClipToMinimumMaximum";
442 return "UserDefinedEnhancement";
444 return "NoEnhancement";
449 if ( contrastEnhancementString ==
"StretchToMinimumMaximum" )
453 else if ( contrastEnhancementString ==
"StretchAndClipToMinimumMaximum" )
457 else if ( contrastEnhancementString ==
"ClipToMinimumMaximum" )
461 else if ( contrastEnhancementString ==
"UserDefinedEnhancement" )
Sixty four bit floating point (double)
~QgsContrastEnhancement()
void setContrastEnhancementAlgorithm(ContrastEnhancementAlgorithm, bool generateTable=true)
Set the contrast enhancement algorithm.
void writeXML(QDomDocument &doc, QDomElement &parentElem) const
Sixteen bit signed integer (qint16)
static QString printValue(double value)
Print double value with all necessary significant digits.
void readXML(const QDomElement &elem)
QDomNode appendChild(const QDomNode &newChild)
Eight bit unsigned integer (quint8)
Sixteen bit unsigned integer (quint16)
bool isValueInDisplayableRange(double)
Return true if pixel is in stretable range, false if pixel is outside of range (i.e., clipped)
static double maximumValuePossible(QGis::DataType)
Helper function that returns the maximum possible value for a GDAL data type.
double toDouble(bool *ok) const
ContrastEnhancementAlgorithm
This enumerator describes the types of contrast enhancement algorithms that can be used...
double ANALYSIS_EXPORT max(double x, double y)
Returns the maximum of two doubles or the first argument if both are equal.
void setContrastEnhancementFunction(QgsContrastEnhancementFunction *)
A public method that allows the user to set their own custom contrast enhancment function.
void setMinimumValue(double)
Mutator for the minimum value.
QString number(int n, int base)
static double minimumValuePossible(QGis::DataType)
Helper function that returns the minimum possible value for a GDAL data type.
Thirty two bit floating point (float)
#define QgsDebugMsgLevel(str, level)
A linear enhanceContrast enhancement that first clips to min max and then enhanceContrastes linearly ...
void setMinimumValue(double, bool generateTable=true)
Return the minimum value for the contrast enhancement range.
static QString contrastEnhancementAlgorithmString(ContrastEnhancementAlgorithm algorithm)
A contrast enhancement funcion is the base class for all raster contrast enhancements.
DataType
Raster data types.
A color enhancement function that performs a linear enhanceContrast between min and max...
QDomText createTextNode(const QString &value)
QgsContrastEnhancement(QGis::DataType theDatatype=QGis::Byte)
static ContrastEnhancementAlgorithm contrastEnhancementAlgorithmFromString(const QString &contrastEnhancementString)
A raster contrast enhancement that will clip a value to the specified min/max range.
Thirty two bit signed integer (qint32)
int enhanceContrast(double)
Apply the contrast enhancement to a value.
Unknown or unspecified type.
QDomElement firstChildElement(const QString &tagName) const
virtual int enhance(double)
A customizable method that takes in a double and returns a int between 0 and 255. ...
virtual bool isValueInDisplayableRange(double)
A customicable method to indicate if the pixels is displayable.
Manipulates raster pixel values so that they enhanceContrast or clip into a specified numerical range...
double ANALYSIS_EXPORT min(double x, double y)
Returns the minimum of two doubles or the first argument if both are equal.
QDomElement createElement(const QString &tagName)
Color, alpha, red, green, blue, 4 bytes the same as QImage::Format_ARGB32.
Color, alpha, red, green, blue, 4 bytes the same as QImage::Format_ARGB32_Premultiplied.
void setMaximumValue(double, bool generateTable=true)
Set the maximum value for the contrast enhancement range.
Thirty two bit unsigned integer (quint32)
void setMaximumValue(double)
Mustator for the maximum value.