QGIS API Documentation  3.18.1-Zürich (202f1bf7e5)
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 
22 QgsPaintEffect *QgsColorEffect::create( const QVariantMap &map )
23 {
24  QgsColorEffect *newEffect = new QgsColorEffect();
25  newEffect->readProperties( map );
26  return newEffect;
27 }
28 
30  : mColorizeColor( QColor::fromRgb( 255, 128, 128 ) )
31 {
32 
33 }
34 
36 {
37  if ( !source() || !enabled() || !context.painter() )
38  return;
39 
40  QPainter *painter = context.painter();
41 
42  //rasterize source and apply modifications
43  QImage image = sourceAsImage( context )->copy();
44 
45  QgsImageOperation::adjustBrightnessContrast( image, mBrightness, mContrast / 100.0 + 1 );
46  if ( mGrayscaleMode != QgsImageOperation::GrayscaleOff )
47  {
48  QgsImageOperation::convertToGrayscale( image, static_cast< QgsImageOperation::GrayscaleMode >( mGrayscaleMode ) );
49  }
50  QgsImageOperation::adjustHueSaturation( image, mSaturation, mColorizeOn ? mColorizeColor : QColor(), mColorizeStrength / 100.0 );
51 
52  QgsImageOperation::multiplyOpacity( image, mOpacity );
53  QgsScopedQPainterState painterState( painter );
54  painter->setCompositionMode( mBlendMode );
55  painter->drawImage( imageOffset( context ), image );
56 }
57 
58 
59 QVariantMap QgsColorEffect::properties() const
60 {
61  QVariantMap props;
62  props.insert( QStringLiteral( "enabled" ), mEnabled ? QStringLiteral( "1" ) : QStringLiteral( "0" ) );
63  props.insert( QStringLiteral( "draw_mode" ), QString::number( int( mDrawMode ) ) );
64  props.insert( QStringLiteral( "blend_mode" ), QString::number( int( mBlendMode ) ) );
65  props.insert( QStringLiteral( "opacity" ), QString::number( mOpacity ) );
66  props.insert( QStringLiteral( "brightness" ), QString::number( mBrightness ) );
67  props.insert( QStringLiteral( "contrast" ), QString::number( mContrast ) );
68  props.insert( QStringLiteral( "saturation" ), QString::number( mSaturation ) );
69  props.insert( QStringLiteral( "grayscale_mode" ), QString::number( int( mGrayscaleMode ) ) );
70  props.insert( QStringLiteral( "colorize" ), mColorizeOn ? QStringLiteral( "1" ) : QStringLiteral( "0" ) );
71  props.insert( QStringLiteral( "colorize_color" ), QgsSymbolLayerUtils::encodeColor( mColorizeColor ) );
72  props.insert( QStringLiteral( "colorize_strength" ), QString::number( mColorizeStrength ) );
73 
74  return props;
75 }
76 
77 void QgsColorEffect::readProperties( const QVariantMap &props )
78 {
79  bool ok;
80  QPainter::CompositionMode mode = static_cast< QPainter::CompositionMode >( props.value( QStringLiteral( "blend_mode" ) ).toInt( &ok ) );
81  if ( ok )
82  {
83  mBlendMode = mode;
84  }
85  if ( props.contains( QStringLiteral( "transparency" ) ) )
86  {
87  double transparency = props.value( QStringLiteral( "transparency" ) ).toDouble( &ok );
88  if ( ok )
89  {
90  mOpacity = 1.0 - transparency;
91  }
92  }
93  else
94  {
95  double opacity = props.value( QStringLiteral( "opacity" ) ).toDouble( &ok );
96  if ( ok )
97  {
98  mOpacity = opacity;
99  }
100  }
101  mEnabled = props.value( QStringLiteral( "enabled" ), QStringLiteral( "1" ) ).toInt();
102  mDrawMode = static_cast< QgsPaintEffect::DrawMode >( props.value( QStringLiteral( "draw_mode" ), QStringLiteral( "2" ) ).toInt() );
103 
104  mBrightness = props.value( QStringLiteral( "brightness" ), QStringLiteral( "0" ) ).toInt();
105  mContrast = props.value( QStringLiteral( "contrast" ), QStringLiteral( "0" ) ).toInt();
106  mSaturation = props.value( QStringLiteral( "saturation" ), QStringLiteral( "1.0" ) ).toDouble();
107  mGrayscaleMode = static_cast< QgsImageOperation::GrayscaleMode >( props.value( QStringLiteral( "grayscale_mode" ), QStringLiteral( "0" ) ).toInt() );
108  mColorizeOn = props.value( QStringLiteral( "colorize" ), QStringLiteral( "0" ) ).toInt();
109  if ( props.contains( QStringLiteral( "colorize_color" ) ) )
110  {
111  setColorizeColor( QgsSymbolLayerUtils::decodeColor( props.value( QStringLiteral( "colorize_color" ) ).toString() ) );
112  }
113  mColorizeStrength = props.value( QStringLiteral( "colorize_strength" ), QStringLiteral( "100" ) ).toInt();
114 }
115 
117 {
118  QgsColorEffect *newEffect = new QgsColorEffect( *this );
119  return newEffect;
120 }
121 
122 void QgsColorEffect::setColorizeColor( const QColor &colorizeColor )
123 {
124  mColorizeColor = colorizeColor;
125 }
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.
void draw(QgsRenderContext &context) override
Handles drawing of the effect's result on to the specified render context.
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)