Skip to content

Commit 91c37fb

Browse files
committedJan 27, 2012
Consider contrast enhancement in multiband color renderer
1 parent d61927c commit 91c37fb

File tree

3 files changed

+128
-21
lines changed

3 files changed

+128
-21
lines changed
 

‎src/core/raster/qgsmultibandcolorrenderer.cpp

Lines changed: 91 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,17 @@
1616
***************************************************************************/
1717

1818
#include "qgsmultibandcolorrenderer.h"
19+
#include "qgscontrastenhancement.h"
1920
#include "qgsrastertransparency.h"
2021
#include <QImage>
2122
#include <QSet>
2223

23-
QgsMultiBandColorRenderer::QgsMultiBandColorRenderer( QgsRasterDataProvider* provider, int redBand, int greenBand, int blueBand ):
24-
QgsRasterRenderer( provider ), mRedBand( redBand ), mGreenBand( greenBand ), mBlueBand( blueBand ), mContrastEnhancement( 0 )
24+
QgsMultiBandColorRenderer::QgsMultiBandColorRenderer( QgsRasterDataProvider* provider, int redBand, int greenBand, int blueBand,
25+
QgsContrastEnhancement* redEnhancement,
26+
QgsContrastEnhancement* greenEnhancement,
27+
QgsContrastEnhancement* blueEnhancement ):
28+
QgsRasterRenderer( provider ), mRedBand( redBand ), mGreenBand( greenBand ), mBlueBand( blueBand ),
29+
mRedContrastEnhancement( redEnhancement ), mGreenContrastEnhancement( greenEnhancement ), mBlueContrastEnhancement( blueEnhancement )
2530
{
2631
}
2732

@@ -36,9 +41,21 @@ void QgsMultiBandColorRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
3641
return;
3742
}
3843

39-
QgsRasterDataProvider::DataType redType = ( QgsRasterDataProvider::DataType )mProvider->dataType( mRedBand );
40-
QgsRasterDataProvider::DataType greenType = ( QgsRasterDataProvider::DataType )mProvider->dataType( mGreenBand );
41-
QgsRasterDataProvider::DataType blueType = ( QgsRasterDataProvider::DataType )mProvider->dataType( mBlueBand );
44+
QgsRasterDataProvider::DataType redType;
45+
if ( mRedBand > 0 )
46+
{
47+
redType = ( QgsRasterDataProvider::DataType )mProvider->dataType( mRedBand );
48+
}
49+
QgsRasterDataProvider::DataType greenType;
50+
if ( mGreenBand > 0 )
51+
{
52+
greenType = ( QgsRasterDataProvider::DataType )mProvider->dataType( mGreenBand );
53+
}
54+
QgsRasterDataProvider::DataType blueType;
55+
if ( mBlueBand > 0 )
56+
{
57+
blueType = ( QgsRasterDataProvider::DataType )mProvider->dataType( mBlueBand );
58+
}
4259
QgsRasterDataProvider::DataType transparencyType = QgsRasterDataProvider::UnknownDataType;
4360
if ( mAlphaBand > 0 )
4461
{
@@ -47,7 +64,23 @@ void QgsMultiBandColorRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
4764

4865
double oversamplingX, oversamplingY;
4966
QSet<int> bands;
50-
bands << mRedBand << mGreenBand << mBlueBand;
67+
if ( mRedBand > 0 )
68+
{
69+
bands << mRedBand;
70+
}
71+
if ( mGreenBand > 0 )
72+
{
73+
bands << mGreenBand;
74+
}
75+
if ( mBlueBand > 0 )
76+
{
77+
bands << mBlueBand;
78+
}
79+
if ( bands.size() < 1 )
80+
{
81+
return; //no need to draw anything if no band is set
82+
}
83+
5184
if ( mAlphaBand > 0 )
5285
{
5386
bands << mAlphaBand;
@@ -91,9 +124,18 @@ void QgsMultiBandColorRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
91124
break;
92125
}
93126

94-
redData = bandData[mRedBand];
95-
greenData = bandData[mGreenBand];
96-
blueData = bandData[mBlueBand];
127+
if ( mRedBand > 0 )
128+
{
129+
redData = bandData[mRedBand];
130+
}
131+
if ( mGreenBand > 0 )
132+
{
133+
greenData = bandData[mGreenBand];
134+
}
135+
if ( mBlueBand > 0 )
136+
{
137+
blueData = bandData[mBlueBand];
138+
}
97139
if ( mAlphaBand > 0 )
98140
{
99141
alphaData = bandData[mAlphaBand];
@@ -102,17 +144,53 @@ void QgsMultiBandColorRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
102144
QImage img( nRasterCols, nRasterRows, QImage::Format_ARGB32_Premultiplied );
103145
QRgb* imageScanLine = 0;
104146
int currentRasterPos = 0;
105-
int redVal, greenVal, blueVal;
147+
int redVal = 0;
148+
int greenVal = 0;
149+
int blueVal = 0;
150+
QRgb defaultColor = qRgba( 255, 255, 255, 0 );
106151
double currentOpacity = mOpacity; //opacity (between 0 and 1)
107152

108153
for ( int i = 0; i < nRasterRows; ++i )
109154
{
110155
imageScanLine = ( QRgb* )( img.scanLine( i ) );
111156
for ( int j = 0; j < nRasterCols; ++j )
112157
{
113-
redVal = readValue( redData, redType, currentRasterPos );
114-
greenVal = readValue( greenData, greenType, currentRasterPos );
115-
blueVal = readValue( blueData, blueType, currentRasterPos );
158+
if ( mRedBand )
159+
{
160+
redVal = readValue( redData, redType, currentRasterPos );
161+
}
162+
if ( mGreenBand )
163+
{
164+
greenVal = readValue( greenData, greenType, currentRasterPos );
165+
}
166+
if ( mBlueBand )
167+
{
168+
blueVal = readValue( blueData, blueType, currentRasterPos );
169+
}
170+
171+
//apply default color if red, green or blue not in displayable range
172+
if (( mRedContrastEnhancement && !mRedContrastEnhancement->isValueInDisplayableRange( redVal ) )
173+
|| ( mGreenContrastEnhancement && !mGreenContrastEnhancement->isValueInDisplayableRange( redVal ) )
174+
|| ( mBlueContrastEnhancement && !mBlueContrastEnhancement->isValueInDisplayableRange( redVal ) ) )
175+
{
176+
imageScanLine[j] = defaultColor;
177+
++currentRasterPos;
178+
continue;
179+
}
180+
181+
//stretch color values
182+
if ( mRedContrastEnhancement )
183+
{
184+
redVal = mRedContrastEnhancement->enhanceContrast( redVal );
185+
}
186+
if ( mGreenContrastEnhancement )
187+
{
188+
greenVal = mGreenContrastEnhancement->enhanceContrast( greenVal );
189+
}
190+
if ( mBlueContrastEnhancement )
191+
{
192+
blueVal = mBlueContrastEnhancement->enhanceContrast( blueVal );
193+
}
116194

117195
if ( mInvertColor )
118196
{

‎src/core/raster/qgsmultibandcolorrenderer.h

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,20 +26,30 @@ class QgsContrastEnhancement;
2626
class QgsMultiBandColorRenderer: public QgsRasterRenderer
2727
{
2828
public:
29-
QgsMultiBandColorRenderer( QgsRasterDataProvider* provider, int redBand, int greenBand, int blueBand );
29+
QgsMultiBandColorRenderer( QgsRasterDataProvider* provider, int redBand, int greenBand, int blueBand,
30+
QgsContrastEnhancement* redEnhancement = 0, QgsContrastEnhancement* greenEnhancement = 0,
31+
QgsContrastEnhancement* blueEnhancement = 0 );
3032
~QgsMultiBandColorRenderer();
3133

3234
void draw( QPainter* p, QgsRasterViewPort* viewPort, const QgsMapToPixel* theQgsMapToPixel );
3335

34-
const QgsContrastEnhancement* contrastEnhancement() const { return mContrastEnhancement; }
35-
void setContrastEnhancement( QgsContrastEnhancement* ce ) { mContrastEnhancement = ce; }
36+
const QgsContrastEnhancement* redContrastEnhancement() const { return mRedContrastEnhancement; }
37+
void setRedContrastEnhancement( QgsContrastEnhancement* ce ) { mRedContrastEnhancement = ce; }
38+
39+
const QgsContrastEnhancement* greenContrastEnhancement() const { return mGreenContrastEnhancement; }
40+
void setGreenContrastEnhancement( QgsContrastEnhancement* ce ) { mGreenContrastEnhancement = ce; }
41+
42+
const QgsContrastEnhancement* blueContrastEnhancement() const { return mBlueContrastEnhancement; }
43+
void setBlueContrastEnhancement( QgsContrastEnhancement* ce ) { mBlueContrastEnhancement = ce; }
3644

3745
private:
3846
int mRedBand;
3947
int mGreenBand;
4048
int mBlueBand;
4149

42-
QgsContrastEnhancement* mContrastEnhancement;
50+
QgsContrastEnhancement* mRedContrastEnhancement;
51+
QgsContrastEnhancement* mGreenContrastEnhancement;
52+
QgsContrastEnhancement* mBlueContrastEnhancement;
4353
};
4454

4555
#endif // QGSMULTIBANDCOLORRENDERER_H

‎src/core/raster/qgsrasterlayer.cpp

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -688,10 +688,29 @@ void QgsRasterLayer::setRendererForDrawingStyle( const DrawingStyle & theDrawin
688688
}
689689
case MultiBandColor:
690690
{
691-
int red = bandNumber( mRedBandName );
692-
int green = bandNumber( mGreenBandName );
693-
int blue = bandNumber( mBlueBandName );
694-
renderer = new QgsMultiBandColorRenderer( mDataProvider, red, green, blue );
691+
int red = -1;
692+
QgsContrastEnhancement* redEnhancement = 0;
693+
if ( mRedBandName != TRSTRING_NOT_SET )
694+
{
695+
red = bandNumber( mRedBandName );
696+
redEnhancement = contrastEnhancement( red );
697+
}
698+
int green = -1;
699+
QgsContrastEnhancement* greenEnhancement = 0;
700+
if ( mGreenBandName != TRSTRING_NOT_SET )
701+
{
702+
green = bandNumber( mGreenBandName );
703+
greenEnhancement = contrastEnhancement( green );
704+
}
705+
int blue = -1;
706+
QgsContrastEnhancement* blueEnhancement = 0;
707+
if ( mBlueBandName != TRSTRING_NOT_SET )
708+
{
709+
blue = bandNumber( mBlueBandName );
710+
blueEnhancement = contrastEnhancement( blue );
711+
}
712+
renderer = new QgsMultiBandColorRenderer( mDataProvider, red, green, blue,
713+
redEnhancement, greenEnhancement, blueEnhancement );
695714
break;
696715
}
697716
case SingleBandColorDataStyle:

0 commit comments

Comments
 (0)
Please sign in to comment.