Skip to content

Commit f5431f4

Browse files
committed
[FEATURE] Add colorize control for raster layers
1 parent 3d02fbe commit f5431f4

File tree

4 files changed

+81
-6
lines changed

4 files changed

+81
-6
lines changed

src/app/qgsrasterlayerproperties.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ QgsRasterLayerProperties::QgsRasterLayerProperties( QgsMapLayer* lyr, QgsMapCanv
9090
// enable or disable saturation slider and spin box depending on grayscale combo choice
9191
connect( comboGrayscale, SIGNAL( currentIndexChanged( int ) ), this, SLOT( toggleSaturationControls( int ) ) );
9292

93+
// enable or disable colorize colorbutton with colorize checkbox
94+
connect( mColorizeCheck, SIGNAL( toggled( bool ) ), btnColorizeColor, SLOT( setEnabled( bool ) ) );
95+
9396
// enable or disable Build Pyramids button depending on selection in pyramid list
9497
connect( lbxPyramidResolutions, SIGNAL( itemSelectionChanged() ), this, SLOT( toggleBuildPyramidsButton() ) );
9598

@@ -262,7 +265,12 @@ QgsRasterLayerProperties::QgsRasterLayerProperties( QgsMapLayer* lyr, QgsMapCanv
262265

263266
// Set initial state of saturation controls based on grayscale mode choice
264267
toggleSaturationControls( hueSaturationFilter->grayscaleMode() == QgsHueSaturationFilter::GrayscaleOff );
265-
}
268+
269+
// Set initial state of colorize controls
270+
mColorizeCheck->setChecked( hueSaturationFilter->colorizeOn() );
271+
btnColorizeColor->setEnabled( hueSaturationFilter->colorizeOn() );
272+
btnColorizeColor->setColor( hueSaturationFilter->colorizeColor() );
273+
}
266274

267275
//blend mode
268276
mBlendModeComboBox->setBlendMode( mRasterLayer->blendMode() );
@@ -828,6 +836,8 @@ void QgsRasterLayerProperties::apply()
828836
{
829837
hueSaturationFilter->setSaturation( sliderSaturation->value() );
830838
hueSaturationFilter->setGrayscaleMode(( QgsHueSaturationFilter::GrayscaleMode ) comboGrayscale->currentIndex() );
839+
hueSaturationFilter->setColorizeOn( mColorizeCheck->checkState() );
840+
hueSaturationFilter->setColorizeColor( btnColorizeColor->color() );
831841
}
832842

833843

src/core/raster/qgshuesaturationfilter.cpp

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@
2525
QgsHueSaturationFilter::QgsHueSaturationFilter( QgsRasterInterface* input )
2626
: QgsRasterInterface( input ),
2727
mSaturation( 0 ),
28-
mGrayscaleMode( QgsHueSaturationFilter::GrayscaleOff )
28+
mGrayscaleMode( QgsHueSaturationFilter::GrayscaleOff ),
29+
mColorizeOn( false ),
30+
mColorizeColor( QColor::fromRgb( 255, 128, 128 ) )
2931
{
3032
}
3133

@@ -129,7 +131,7 @@ QgsRasterBlock * QgsHueSaturationFilter::block( int bandNo, QgsRectangle const
129131
return outputBlock;
130132
}
131133

132-
if ( mSaturation == 0 && mGrayscaleMode == GrayscaleOff )
134+
if ( mSaturation == 0 && mGrayscaleMode == GrayscaleOff && !mColorizeOn )
133135
{
134136
QgsDebugMsg( "No hue/saturation change." );
135137
delete outputBlock;
@@ -151,6 +153,11 @@ QgsRasterBlock * QgsHueSaturationFilter::block( int bandNo, QgsRectangle const
151153
// Scale saturation value to [0-2], where 0 = desaturated
152154
double saturationScale = (( double ) mSaturation / 100 ) + 1;
153155

156+
// Get hue, saturation for colorized color
157+
int colorizeH, colorizeS;
158+
colorizeH = mColorizeColor.hue();
159+
colorizeS = mColorizeColor.saturation();
160+
154161
for ( size_t i = 0; i < ( size_t )width*height; i++ )
155162
{
156163
if ( inputBlock->color( i ) == myNoDataColor )
@@ -208,6 +215,18 @@ QgsRasterBlock * QgsHueSaturationFilter::block( int bandNo, QgsRectangle const
208215
}
209216
}
210217

218+
// Colorizing?
219+
if ( mColorizeOn )
220+
{
221+
// Update hsl values (these may have changed with saturation/grayscale adjustments)
222+
myColor.getHsl( &h, &s, &l );
223+
224+
// Overwrite hue and saturation with values from colorize color
225+
h = colorizeH;
226+
s = colorizeS;
227+
myColor = QColor::fromHsl( h, s, l );
228+
}
229+
211230
// Convert back to rgb
212231
outputBlock->setColor( i, myColor.rgb() );
213232
}
@@ -227,6 +246,11 @@ void QgsHueSaturationFilter::writeXML( QDomDocument& doc, QDomElement& parentEle
227246

228247
filterElem.setAttribute( "saturation", QString::number( mSaturation ) );
229248
filterElem.setAttribute( "grayscaleMode", QString::number( mGrayscaleMode ) );
249+
filterElem.setAttribute( "colorizeOn", QString::number( mColorizeOn ) );
250+
filterElem.setAttribute( "colorizeRed", QString::number( mColorizeColor.red() ) );
251+
filterElem.setAttribute( "colorizeGreen", QString::number( mColorizeColor.green() ) );
252+
filterElem.setAttribute( "colorizeBlue", QString::number( mColorizeColor.blue() ) );
253+
230254
parentElem.appendChild( filterElem );
231255
}
232256

@@ -239,4 +263,11 @@ void QgsHueSaturationFilter::readXML( const QDomElement& filterElem )
239263

240264
mSaturation = filterElem.attribute( "saturation", "0" ).toInt();
241265
mGrayscaleMode = ( QgsHueSaturationFilter::GrayscaleMode )filterElem.attribute( "grayscaleMode", "0" ).toInt();
266+
267+
mColorizeOn = ( bool )filterElem.attribute( "colorizeOn", "0" ).toInt();
268+
int mColorizeRed = filterElem.attribute( "colorizeRed", "255" ).toInt();
269+
int mColorizeGreen = filterElem.attribute( "colorizeGreen", "0" ).toInt();
270+
int mColorizeBlue = filterElem.attribute( "colorizeBlue", "0" ).toInt();
271+
mColorizeColor = QColor::fromRgb( mColorizeRed, mColorizeGreen, mColorizeBlue );
272+
242273
}

src/core/raster/qgshuesaturationfilter.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,11 @@ class CORE_EXPORT QgsHueSaturationFilter : public QgsRasterInterface
5858
void setGrayscaleMode( QgsHueSaturationFilter::GrayscaleMode grayscaleMode ) { mGrayscaleMode = grayscaleMode; }
5959
QgsHueSaturationFilter::GrayscaleMode grayscaleMode() const { return mGrayscaleMode; }
6060

61+
void setColorizeOn( bool colorizeOn ) { mColorizeOn = colorizeOn; }
62+
bool colorizeOn() const { return mColorizeOn; }
63+
void setColorizeColor( QColor colorizeColor ) { mColorizeColor = colorizeColor; }
64+
QColor colorizeColor() const { return mColorizeColor; }
65+
6166
void writeXML( QDomDocument& doc, QDomElement& parentElem );
6267

6368
/**Sets base class members from xml. Usually called from create() methods of subclasses*/
@@ -70,6 +75,10 @@ class CORE_EXPORT QgsHueSaturationFilter : public QgsRasterInterface
7075
/**Current grayscale mode*/
7176
QgsHueSaturationFilter::GrayscaleMode mGrayscaleMode;
7277

78+
/**Colorize settings*/
79+
bool mColorizeOn;
80+
QColor mColorizeColor;
81+
7382
};
7483

7584
#endif // QGSHUESATURATIONFILTER_H

src/ui/qgsrasterlayerpropertiesbase.ui

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@
288288
</property>
289289
</widget>
290290
</item>
291-
<item row="0" column="2">
291+
<item row="0" column="3">
292292
<widget class="QSpinBox" name="spinBoxSaturation">
293293
<property name="minimum">
294294
<number>-100</number>
@@ -311,14 +311,14 @@
311311
</property>
312312
</widget>
313313
</item>
314-
<item row="0" column="4">
314+
<item row="0" column="5">
315315
<widget class="QLabel" name="labelGrayscale">
316316
<property name="text">
317317
<string>Grayscale</string>
318318
</property>
319319
</widget>
320320
</item>
321-
<item row="0" column="5">
321+
<item row="0" column="6">
322322
<widget class="QComboBox" name="comboGrayscale">
323323
<item>
324324
<property name="text">
@@ -342,6 +342,26 @@
342342
</item>
343343
</widget>
344344
</item>
345+
<item row="1" column="1">
346+
<widget class="QgsColorButton" name="btnColorizeColor">
347+
<property name="maximumSize">
348+
<size>
349+
<width>64</width>
350+
<height>16777215</height>
351+
</size>
352+
</property>
353+
<property name="text">
354+
<string/>
355+
</property>
356+
</widget>
357+
</item>
358+
<item row="1" column="0">
359+
<widget class="QCheckBox" name="mColorizeCheck">
360+
<property name="text">
361+
<string>Colorize</string>
362+
</property>
363+
</widget>
364+
</item>
345365
</layout>
346366
</widget>
347367
</item>
@@ -1403,6 +1423,11 @@ p, li { white-space: pre-wrap; }
14031423
<extends>QComboBox</extends>
14041424
<header>qgsblendmodecombobox.h</header>
14051425
</customwidget>
1426+
<customwidget>
1427+
<class>QgsColorButton</class>
1428+
<extends>QPushButton</extends>
1429+
<header>qgscolorbutton.h</header>
1430+
</customwidget>
14061431
</customwidgets>
14071432
<tabstops>
14081433
<tabstop>tabBar</tabstop>

0 commit comments

Comments
 (0)