QGIS API Documentation  3.20.0-Odense (decaadbb31)
qgscoloreffect.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgscoloreffect.cpp
3  ------------------
4  begin : March 2015
5  copyright : (C) 2015 Nyall Dawson
6  email : nyall dot dawson at gmail dot com
7  ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 #include "qgscoloreffect.h"
19 #include "qgsimageoperation.h"
20 #include "qgssymbollayerutils.h"
21 #include <algorithm>
22 
23 QgsPaintEffect *QgsColorEffect::create( const QVariantMap &map )
24 {
25  QgsColorEffect *newEffect = new QgsColorEffect();
26  newEffect->readProperties( map );
27  return newEffect;
28 }
29 
31  : mColorizeColor( QColor::fromRgb( 255, 128, 128 ) )
32 {
33 
34 }
35 
37 {
38  if ( !source() || !enabled() || !context.painter() )
39  return;
40 
41  QPainter *painter = context.painter();
42 
43  //rasterize source and apply modifications
44  QImage image = sourceAsImage( context )->copy();
45 
46  QgsImageOperation::adjustBrightnessContrast( image, mBrightness, mContrast / 100.0 + 1 );
47  if ( mGrayscaleMode != QgsImageOperation::GrayscaleOff )
48  {
49  QgsImageOperation::convertToGrayscale( image, static_cast< QgsImageOperation::GrayscaleMode >( mGrayscaleMode ) );
50  }
51  QgsImageOperation::adjustHueSaturation( image, mSaturation, mColorizeOn ? mColorizeColor : QColor(), mColorizeStrength / 100.0 );
52 
53  QgsImageOperation::multiplyOpacity( image, mOpacity );
54  QgsScopedQPainterState painterState( painter );
55  painter->setCompositionMode( mBlendMode );
56  painter->drawImage( imageOffset( context ), image );
57 }
58 
59 
60 QVariantMap QgsColorEffect::properties() const
61 {
62  QVariantMap props;
63  props.insert( QStringLiteral( "enabled" ), mEnabled ? QStringLiteral( "1" ) : QStringLiteral( "0" ) );
64  props.insert( QStringLiteral( "draw_mode" ), QString::number( int( mDrawMode ) ) );
65  props.insert( QStringLiteral( "blend_mode" ), QString::number( int( mBlendMode ) ) );
66  props.insert( QStringLiteral( "opacity" ), QString::number( mOpacity ) );
67  props.insert( QStringLiteral( "brightness" ), QString::number( mBrightness ) );
68  props.insert( QStringLiteral( "contrast" ), QString::number( mContrast ) );
69  props.insert( QStringLiteral( "saturation" ), QString::number( mSaturation ) );
70  props.insert( QStringLiteral( "grayscale_mode" ), QString::number( int( mGrayscaleMode ) ) );
71  props.insert( QStringLiteral( "colorize" ), mColorizeOn ? QStringLiteral( "1" ) : QStringLiteral( "0" ) );
72  props.insert( QStringLiteral( "colorize_color" ), QgsSymbolLayerUtils::encodeColor( mColorizeColor ) );
73  props.insert( QStringLiteral( "colorize_strength" ), QString::number( mColorizeStrength ) );
74 
75  return props;
76 }
77 
78 void QgsColorEffect::readProperties( const QVariantMap &props )
79 {
80  bool ok;
81  QPainter::CompositionMode mode = static_cast< QPainter::CompositionMode >( props.value( QStringLiteral( "blend_mode" ) ).toInt( &ok ) );
82  if ( ok )
83  {
84  mBlendMode = mode;
85  }
86  if ( props.contains( QStringLiteral( "transparency" ) ) )
87  {
88  double transparency = props.value( QStringLiteral( "transparency" ) ).toDouble( &ok );
89  if ( ok )
90  {
91  mOpacity = 1.0 - transparency;
92  }
93  }
94  else
95  {
96  double opacity = props.value( QStringLiteral( "opacity" ) ).toDouble( &ok );
97  if ( ok )
98  {
99  mOpacity = opacity;
100  }
101  }
102  mEnabled = props.value( QStringLiteral( "enabled" ), QStringLiteral( "1" ) ).toInt();
103  mDrawMode = static_cast< QgsPaintEffect::DrawMode >( props.value( QStringLiteral( "draw_mode" ), QStringLiteral( "2" ) ).toInt() );
104 
105  mBrightness = props.value( QStringLiteral( "brightness" ), QStringLiteral( "0" ) ).toInt();
106  mContrast = props.value( QStringLiteral( "contrast" ), QStringLiteral( "0" ) ).toInt();
107  mSaturation = props.value( QStringLiteral( "saturation" ), QStringLiteral( "1.0" ) ).toDouble();
108  mGrayscaleMode = static_cast< QgsImageOperation::GrayscaleMode >( props.value( QStringLiteral( "grayscale_mode" ), QStringLiteral( "0" ) ).toInt() );
109  mColorizeOn = props.value( QStringLiteral( "colorize" ), QStringLiteral( "0" ) ).toInt();
110  if ( props.contains( QStringLiteral( "colorize_color" ) ) )
111  {
112  setColorizeColor( QgsSymbolLayerUtils::decodeColor( props.value( QStringLiteral( "colorize_color" ) ).toString() ) );
113  }
114  mColorizeStrength = props.value( QStringLiteral( "colorize_strength" ), QStringLiteral( "100" ) ).toInt();
115 }
116 
118 {
119  QgsColorEffect *newEffect = new QgsColorEffect( *this );
120  return newEffect;
121 }
122 
123 void QgsColorEffect::setBrightness( int brightness )
124 {
125  mBrightness = std::clamp( brightness, -255, 255 );
126 }
127 
128 void QgsColorEffect::setContrast( int contrast )
129 {
130  mContrast = std::clamp( contrast, -100, 100 );
131 }
132 
133 void QgsColorEffect::setColorizeColor( const QColor &colorizeColor )
134 {
135  mColorizeColor = colorizeColor;
136 }
A paint effect which alters the colors (e.g., brightness, contrast) in a source picture.
void readProperties(const QVariantMap &props) override
Reads a string map of an effect's properties and restores the effect to the state described by the pr...
double opacity() const
Returns the opacity for the effect.
QgsColorEffect * clone() const override
Duplicates an effect by creating a deep copy of the effect.
void setColorizeColor(const QColor &colorizeColor)
Sets the color used for colorizing a picture.
static QgsPaintEffect * create(const QVariantMap &map)
Creates a new QgsColorEffect effect from a properties string map.
int contrast() const
Returns the contrast modification for the effect.
int brightness() const
Returns the brightness modification for the effect.
void setContrast(int contrast)
Sets the contrast modification for the effect.
void draw(QgsRenderContext &context) override
Handles drawing of the effect's result on to the specified render context.
void setBrightness(int brightness)
Sets the brightness modification for the effect.
QVariantMap properties() const override
Returns the properties describing the paint effect encoded in a string format.
QColor colorizeColor() const
Returns the color used for colorizing a picture.
static void convertToGrayscale(QImage &image, GrayscaleMode mode=GrayscaleLuminosity)
Convert a QImage to a grayscale image.
static void multiplyOpacity(QImage &image, double factor)
Multiplies opacity of image pixel values by a factor.
static void adjustHueSaturation(QImage &image, double saturation, const QColor &colorizeColor=QColor(), double colorizeStrength=1.0)
Alter the hue or saturation of a QImage.
static void adjustBrightnessContrast(QImage &image, int brightness, double contrast)
Alter the brightness or contrast of a QImage.
GrayscaleMode
Modes for converting a QImage to grayscale.
@ GrayscaleOff
No change.
Base class for visual effects which can be applied to QPicture drawings.
DrawMode mDrawMode
const QPicture * source() const
Returns the source QPicture.
QPointF imageOffset(const QgsRenderContext &context) const
Returns the offset which should be used when drawing the source image on to a destination render cont...
bool enabled() const
Returns whether the effect is enabled.
DrawMode
Drawing modes for effects.
QImage * sourceAsImage(QgsRenderContext &context)
Returns the source QPicture rendered to a new QImage.
Contains information about the context of a rendering operation.
QPainter * painter()
Returns the destination QPainter for the render operation.
Scoped object for saving and restoring a QPainter object's state.
static QColor decodeColor(const QString &str)
static QString encodeColor(const QColor &color)