29 #include <QDomDocument>
30 #include <QDomElement>
33 : mMinimumValue( minimumValuePossible( dataType ) )
34 , mMaximumValue( maximumValuePossible( dataType ) )
35 , mRasterDataType( dataType )
36 , mRasterDataTypeRange( mMaximumValue - mMinimumValue )
37 , mLookupTableOffset( mMinimumValue * -1 )
42 if ( mRasterDataTypeRange <= 65535.0 )
44 mLookupTable =
new int[
static_cast <int>( mRasterDataTypeRange + 1 )];
49 : mEnhancementDirty( true )
50 , mMinimumValue( ce.mMinimumValue )
51 , mMaximumValue( ce.mMaximumValue )
52 , mRasterDataType( ce.mRasterDataType )
53 , mRasterDataTypeRange( ce.mRasterDataTypeRange )
61 if ( mRasterDataTypeRange <= 65535.0 )
63 mLookupTable =
new int[
static_cast <int>( mRasterDataTypeRange + 1 )];
69 delete [] mLookupTable;
74 if ( mEnhancementDirty )
76 generateLookupTable();
79 if ( mLookupTable &&
NoEnhancement != mContrastEnhancementAlgorithm )
81 const double shiftedValue = value + mLookupTableOffset;
82 if ( shiftedValue >= 0 && shiftedValue < mRasterDataTypeRange + 1 )
83 return mLookupTable[
static_cast <int>( shiftedValue )];
91 return mContrastEnhancementFunction->enhance( value );
95 bool QgsContrastEnhancement::generateLookupTable()
97 mEnhancementDirty =
false;
99 if ( !mContrastEnhancementFunction )
109 QgsDebugMsgLevel( QStringLiteral(
"***MinimumValue : %1" ).arg( mMinimumValue ), 4 );
110 QgsDebugMsgLevel( QStringLiteral(
"***MaximumValue : %1" ).arg( mMaximumValue ), 4 );
111 QgsDebugMsgLevel( QStringLiteral(
"***mLookupTableOffset : %1" ).arg( mLookupTableOffset ), 4 );
112 QgsDebugMsgLevel( QStringLiteral(
"***mRasterDataTypeRange : %1" ).arg( mRasterDataTypeRange ), 4 );
114 for (
int myIterator = 0; myIterator <= mRasterDataTypeRange; myIterator++ )
116 mLookupTable[myIterator] = mContrastEnhancementFunction->enhance(
static_cast< double >( myIterator ) - mLookupTableOffset );
124 if ( mContrastEnhancementFunction )
126 return mContrastEnhancementFunction->isValueInDisplayableRange( value );
153 mEnhancementDirty =
true;
154 mContrastEnhancementAlgorithm =
algorithm;
158 generateLookupTable();
168 mContrastEnhancementFunction.reset(
function );
170 generateLookupTable();
176 QgsDebugMsgLevel(
"called value: " + QString::number( value ) +
" generate lookup table: " + QString::number(
static_cast< int >( generateTable ) ), 4 );
184 mMaximumValue = value;
187 if ( mContrastEnhancementFunction )
189 mContrastEnhancementFunction->setMaximumValue( value );
192 mEnhancementDirty =
true;
196 generateLookupTable();
202 QgsDebugMsgLevel(
"called value: " + QString::number( value ) +
" generate lookup table: " + QString::number(
static_cast< int >( generateTable ) ), 4 );
210 mMinimumValue = value;
213 if ( mContrastEnhancementFunction )
215 mContrastEnhancementFunction->setMinimumValue( value );
218 mEnhancementDirty =
true;
222 generateLookupTable();
229 QDomElement minElem = doc.createElement( QStringLiteral(
"minValue" ) );
231 minElem.appendChild( minText );
232 parentElem.appendChild( minElem );
235 QDomElement maxElem = doc.createElement( QStringLiteral(
"maxValue" ) );
237 maxElem.appendChild( maxText );
238 parentElem.appendChild( maxElem );
241 QDomElement algorithmElem = doc.createElement( QStringLiteral(
"algorithm" ) );
243 algorithmElem.appendChild( algorithmText );
244 parentElem.appendChild( algorithmElem );
249 const QDomElement minValueElem = elem.firstChildElement( QStringLiteral(
"minValue" ) );
250 if ( !minValueElem.isNull() )
252 mMinimumValue = minValueElem.text().toDouble();
254 const QDomElement maxValueElem = elem.firstChildElement( QStringLiteral(
"maxValue" ) );
255 if ( !maxValueElem.isNull() )
257 mMaximumValue = maxValueElem.text().toDouble();
259 const QDomElement algorithmElem = elem.firstChildElement( QStringLiteral(
"algorithm" ) );
260 if ( !algorithmElem.isNull() )
262 const QString algorithmString = algorithmElem.text();
265 if ( algorithmString == QLatin1String(
"0" ) )
269 else if ( algorithmString == QLatin1String(
"1" ) )
273 else if ( algorithmString == QLatin1String(
"2" ) )
277 else if ( algorithmString == QLatin1String(
"3" ) )
281 else if ( algorithmString == QLatin1String(
"4" ) )
296 if ( doc.isNull() || element.isNull() )
303 algName = QStringLiteral(
"StretchToMinimumMaximum" );
308 algName = QStringLiteral(
"ClipToMinimumMaximum" );
311 algName = QStringLiteral(
"ClipToMinimumMaximum" );
317 QgsDebugMsg( QObject::tr(
"No SLD1.0 conversion yet for stretch algorithm %1" ).arg( algName ) );
324 QDomElement normalizeElem = doc.createElement( QStringLiteral(
"sld:Normalize" ) );
325 element.appendChild( normalizeElem );
327 QDomElement vendorOptionAlgorithmElem = doc.createElement( QStringLiteral(
"sld:VendorOption" ) );
328 vendorOptionAlgorithmElem.setAttribute( QStringLiteral(
"name" ), QStringLiteral(
"algorithm" ) );
329 vendorOptionAlgorithmElem.appendChild( doc.createTextNode( algName ) );
330 normalizeElem.appendChild( vendorOptionAlgorithmElem );
332 QDomElement vendorOptionMinValueElem = doc.createElement( QStringLiteral(
"sld:VendorOption" ) );
333 vendorOptionMinValueElem.setAttribute( QStringLiteral(
"name" ), QStringLiteral(
"minValue" ) );
334 vendorOptionMinValueElem.appendChild( doc.createTextNode( QString::number(
minimumValue() ) ) );
335 normalizeElem.appendChild( vendorOptionMinValueElem );
337 QDomElement vendorOptionMaxValueElem = doc.createElement( QStringLiteral(
"sld:VendorOption" ) );
338 vendorOptionMaxValueElem.setAttribute( QStringLiteral(
"name" ), QStringLiteral(
"maxValue" ) );
339 vendorOptionMaxValueElem.appendChild( doc.createTextNode( QString::number(
maximumValue() ) ) );
340 normalizeElem.appendChild( vendorOptionMaxValueElem );
348 return QStringLiteral(
"NoEnhancement" );
350 return QStringLiteral(
"StretchToMinimumMaximum" );
352 return QStringLiteral(
"StretchAndClipToMinimumMaximum" );
354 return QStringLiteral(
"ClipToMinimumMaximum" );
356 return QStringLiteral(
"UserDefinedEnhancement" );
358 return QStringLiteral(
"NoEnhancement" );
363 if ( contrastEnhancementString == QLatin1String(
"StretchToMinimumMaximum" ) )
367 else if ( contrastEnhancementString == QLatin1String(
"StretchAndClipToMinimumMaximum" ) )
371 else if ( contrastEnhancementString == QLatin1String(
"ClipToMinimumMaximum" ) )
375 else if ( contrastEnhancementString == QLatin1String(
"UserDefinedEnhancement" ) )
DataType
Raster data types.
@ Int16
Sixteen bit signed integer (qint16)
@ UInt16
Sixteen bit unsigned integer (quint16)
@ Byte
Eight bit unsigned integer (quint8)
A raster contrast enhancement that will clip a value to the specified min/max range.
A contrast enhancement function is the base class for all raster contrast enhancements.
Manipulates raster or point cloud pixel values so that they enhanceContrast or clip into a specified ...
ContrastEnhancementAlgorithm
This enumerator describes the types of contrast enhancement algorithms that can be used.
@ StretchToMinimumMaximum
Linear histogram.
@ StretchAndClipToMinimumMaximum
@ NoEnhancement
Default color scaling algorithm, no scaling is applied.
QgsContrastEnhancement(Qgis::DataType datatype=Qgis::DataType::Byte)
Constructor for QgsContrastEnhancement, for the specified data type.
void setMinimumValue(double value, bool generateTable=true)
Sets the minimum value for the contrast enhancement range.
static QString contrastEnhancementAlgorithmString(ContrastEnhancementAlgorithm algorithm)
Returns a string to serialize ContrastEnhancementAlgorithm.
static ContrastEnhancementAlgorithm contrastEnhancementAlgorithmFromString(const QString &contrastEnhancementString)
Deserialize ContrastEnhancementAlgorithm.
static double maximumValuePossible(Qgis::DataType dataType)
Helper function that returns the maximum possible value for a data type.
void setContrastEnhancementAlgorithm(ContrastEnhancementAlgorithm algorithm, bool generateTable=true)
Sets the contrast enhancement algorithm.
bool isValueInDisplayableRange(double value)
Returns true if a pixel value is in displayable range, false if pixel is outside of range (i....
int enhanceContrast(double value)
Applies the contrast enhancement to a value.
void writeXml(QDomDocument &doc, QDomElement &parentElem) const
void readXml(const QDomElement &elem)
double minimumValue() const
Returns the minimum value for the contrast enhancement range.
static double minimumValuePossible(Qgis::DataType dataType)
Helper function that returns the minimum possible value for a data type.
void setContrastEnhancementFunction(QgsContrastEnhancementFunction *function)
Allows the user to set their own custom contrast enhancement function.
void toSld(QDomDocument &doc, QDomElement &element) const
Write ContrastEnhancement tags following SLD v1.0 specs SLD1.0 is limited to the parameters listed in...
~QgsContrastEnhancement()
ContrastEnhancementAlgorithm contrastEnhancementAlgorithm() const
void setMaximumValue(double value, bool generateTable=true)
Sets the maximum value for the contrast enhancement range.
double maximumValue() const
Returns the maximum value for the contrast enhancement range.
A linear enhanceContrast enhancement that first clips to min max and then enhanceContrastes linearly ...
A color enhancement function that performs a linear enhanceContrast between min and max.
static QString printValue(double value)
Print double value with all necessary significant digits.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into allowing algorithms to be written in pure substantial changes are required in order to port existing x Processing algorithms for QGIS x The most significant changes are outlined not GeoAlgorithm For algorithms which operate on features one by consider subclassing the QgsProcessingFeatureBasedAlgorithm class This class allows much of the boilerplate code for looping over features from a vector layer to be bypassed and instead requires implementation of a processFeature method Ensure that your algorithm(or algorithm 's parent class) implements the new pure virtual createInstance(self) call
#define QgsDebugMsgLevel(str, level)