22 #include <QDomDocument> 23 #include <QDomElement> 33 , mGreenBand( greenBand )
34 , mBlueBand( blueBand )
35 , mRedContrastEnhancement( redEnhancement )
36 , mGreenContrastEnhancement( greenEnhancement )
37 , mBlueContrastEnhancement( blueEnhancement )
43 delete mRedContrastEnhancement;
44 delete mGreenContrastEnhancement;
45 delete mBlueContrastEnhancement;
51 if ( mRedContrastEnhancement )
55 if ( mGreenContrastEnhancement )
59 if ( mBlueContrastEnhancement )
72 delete mRedContrastEnhancement;
73 mRedContrastEnhancement = ce;
78 delete mGreenContrastEnhancement;
79 mGreenContrastEnhancement = ce;
84 delete mBlueContrastEnhancement;
85 mBlueContrastEnhancement = ce;
103 if ( !redContrastElem.
isNull() )
107 redContrastEnhancement->
readXML( redContrastElem );
112 if ( !greenContrastElem.
isNull() )
116 greenContrastEnhancement->
readXML( greenContrastElem );
121 if ( !blueContrastElem.
isNull() )
125 blueContrastEnhancement->
readXML( blueContrastElem );
129 greenContrastEnhancement, blueContrastEnhancement );
145 && mRedBand > 0 && mGreenBand > 0 && mBlueBand > 0
146 &&
mAlphaBand < 1 && !mRedContrastEnhancement && !mGreenContrastEnhancement && !mBlueContrastEnhancement );
153 if ( mGreenBand > 0 )
161 if ( bands.
size() < 1 )
176 for ( ; bandIt != bands.
constEnd(); ++bandIt )
178 bandBlocks.
insert( *bandIt, defaultPointer );
187 for ( ; bandIt != bands.
constEnd(); ++bandIt )
189 bandBlocks[*bandIt] =
mInput->
block( *bandIt, extent, width, height );
190 if ( !bandBlocks[*bandIt] )
195 for ( ; bandIt != bands.
constBegin(); --bandIt )
197 delete bandBlocks[*bandIt];
205 redBlock = bandBlocks[mRedBand];
207 if ( mGreenBand > 0 )
209 greenBlock = bandBlocks[mGreenBand];
213 blueBlock = bandBlocks[mBlueBand];
222 for (
int i = 0; i < bandBlocks.
size(); i++ )
224 delete bandBlocks.
value( i );
239 outputBlock->
setColor( i, myDefaultColor );
243 int redVal = ( int )redBlock->
value( i );
244 int greenVal = ( int )greenBlock->
value( i );
245 int blueVal = ( int )blueBlock->
value( i );
246 outputBlock->
setColor( i, qRgba( redVal, greenVal, blueVal, 255 ) );
251 bool isNoData =
false;
257 redVal = redBlock->
value( i );
258 if ( redBlock->
isNoData( i ) ) isNoData =
true;
260 if ( !isNoData && mGreenBand > 0 )
262 greenVal = greenBlock->
value( i );
263 if ( greenBlock->
isNoData( i ) ) isNoData =
true;
265 if ( !isNoData && mBlueBand > 0 )
267 blueVal = blueBlock->
value( i );
268 if ( blueBlock->
isNoData( i ) ) isNoData =
true;
272 outputBlock->
setColor( i, myDefaultColor );
281 outputBlock->
setColor( i, myDefaultColor );
286 if ( mRedContrastEnhancement )
290 if ( mGreenContrastEnhancement )
294 if ( mBlueContrastEnhancement )
307 currentOpacity *= alphaBlock->
value( i ) / 255.0;
312 outputBlock->
setColor( i, qRgba( redVal, greenVal, blueVal, 255 ) );
316 outputBlock->
setColor( i, qRgba( currentOpacity * redVal, currentOpacity * greenVal, currentOpacity * blueVal, currentOpacity * 255 ) );
322 for ( ; bandDelIt != bandBlocks.
constEnd(); ++bandDelIt )
324 delete bandDelIt.
value();
332 if ( parentElem.
isNull() )
340 rasterRendererElem.
setAttribute(
"greenBand", mGreenBand );
341 rasterRendererElem.
setAttribute(
"blueBand", mBlueBand );
344 if ( mRedContrastEnhancement )
347 mRedContrastEnhancement->
writeXML( doc, redContrastElem );
350 if ( mGreenContrastEnhancement )
353 mGreenContrastEnhancement->
writeXML( doc, greenContrastElem );
354 rasterRendererElem.
appendChild( greenContrastElem );
356 if ( mBlueContrastEnhancement )
359 mBlueContrastEnhancement->
writeXML( doc, blueContrastElem );
360 rasterRendererElem.
appendChild( blueContrastElem );
368 if ( mRedBand != -1 )
370 bandList << mRedBand;
372 if ( mGreenBand != -1 )
374 bandList << mGreenBand;
376 if ( mBlueBand != -1 )
378 bandList << mBlueBand;
void writeXML(QDomDocument &doc, QDomElement &parentElem) const
A rectangle specified with double values.
static QgsRasterRenderer * create(const QDomElement &elem, QgsRasterInterface *input)
const QgsContrastEnhancement * greenContrastEnhancement() const
void readXML(const QDomElement &elem)
QDomNode appendChild(const QDomNode &newChild)
QString attribute(const QString &name, const QString &defValue) const
bool isValueInDisplayableRange(double)
Return true if pixel is in stretable range, false if pixel is outside of range (i.e., clipped)
const_iterator constBegin() const
virtual QgsRasterInterface * input() const
Current input.
void writeXML(QDomDocument &doc, QDomElement &parentElem) const override
Write base class members to xml.
const QgsContrastEnhancement * redContrastEnhancement() const
QgsMultiBandColorRenderer * clone() const override
Clone itself, create deep copy.
bool isNoData(int row, int column)
Check if value at position is no data.
bool qgsDoubleNear(double a, double b, double epsilon=4 *DBL_EPSILON)
void setGreenContrastEnhancement(QgsContrastEnhancement *ce)
Takes ownership.
void readXML(const QDomElement &rendererElem) override
Sets base class members from xml.
QList< int > usesBands() const override
Returns a list of band numbers used by the renderer.
bool usesTransparency() const
QgsRasterTransparency * mRasterTransparency
Raster transparency per color or value.
bool setColor(int row, int column, QRgb color)
Set color on position.
static const QRgb NODATA_COLOR
int alphaValue(double, int theGlobalTransparency=255) const
Returns the transparency value for a single value Pixel.
Color, alpha, red, green, blue, 4 bytes the same as QImage::Format_ARGB32_Premultiplied.
void setRedContrastEnhancement(QgsContrastEnhancement *ce)
Takes ownership.
double value(int row, int column) const
Read a single value if type of block is numeric.
void setAttribute(const QString &name, const QString &value)
int toInt(bool *ok, int base) const
const_iterator constEnd() const
const_iterator constEnd() const
int mAlphaBand
Read alpha value from band.
virtual QGis::DataType dataType(int bandNo) const =0
Returns data type for the band specified by number.
void setAlphaBand(int band)
Base class for processing filters like renderers, reprojector, resampler etc.
unsigned long long qgssize
Qgssize is used instead of size_t, because size_t is stdlib type, unknown by SIP, and it would be har...
const QgsContrastEnhancement * blueContrastEnhancement() const
bool reset(QGis::DataType theDataType, int theWidth, int theHeight)
Reset block.
const_iterator constBegin() const
virtual QgsRectangle extent()
Get the extent of the interface.
int enhanceContrast(double)
Apply the contrast enhancement to a value.
QDomElement firstChildElement(const QString &tagName) const
DataType
Raster data types.
void setBlueContrastEnhancement(QgsContrastEnhancement *ce)
Takes ownership.
virtual QgsRasterBlock * block(int bandNo, const QgsRectangle &extent, int width, int height)=0
Read block of data using given extent and size.
Renderer for multiband images with the color components.
double mOpacity
Global alpha value (0-1)
Manipulates raster pixel values so that they enhanceContrast or clip into a specified numerical range...
iterator insert(const Key &key, const T &value)
Defines the list of pixel values to be considered as transparent or semi transparent when rendering r...
void setOpacity(double opacity)
QgsMultiBandColorRenderer(QgsRasterInterface *input, int redBand, int greenBand, int blueBand, QgsContrastEnhancement *redEnhancement=nullptr, QgsContrastEnhancement *greenEnhancement=nullptr, QgsContrastEnhancement *blueEnhancement=nullptr)
QDomElement createElement(const QString &tagName)
void _writeXML(QDomDocument &doc, QDomElement &rasterRendererElem) const
Write upper class info into rasterrenderer element (called by writeXML method of subclasses) ...
~QgsMultiBandColorRenderer()
QgsRasterInterface * mInput
void setRasterTransparency(QgsRasterTransparency *t)
QgsRasterBlock * block(int bandNo, const QgsRectangle &extent, int width, int height) override
Read block of data using given extent and size.
Raster renderer pipe that applies colors to a raster.
const T value(const Key &key) const