18 #ifndef QGSIMAGEOPERATION_H 19 #define QGSIMAGEOPERATION_H 25 #include "qgis_core.h" 75 static void convertToGrayscale( QImage &image,
GrayscaleMode mode = GrayscaleLuminosity );
87 static void adjustBrightnessContrast( QImage &image,
int brightness,
double contrast );
97 static void adjustHueSaturation( QImage &image,
double saturation,
const QColor &colorizeColor = QColor(),
98 double colorizeStrength = 1.0 );
105 static void multiplyOpacity( QImage &image,
double factor );
113 static void overlayColor( QImage &image,
const QColor &color );
124 bool shadeExterior =
true;
130 bool useMaxDistance =
true;
136 double spread = 10.0;
162 static void stackBlur( QImage &image,
int radius,
bool alphaOnly =
false );
172 static QImage *gaussianBlur( QImage &image,
int radius )
SIP_FACTORY;
179 static void flipImage( QImage &image,
FlipType type );
191 static QRect nonTransparentImageRect(
const QImage &image, QSize minSize = QSize(),
bool center =
false );
202 static QImage cropTransparent(
const QImage &image, QSize minSize = QSize(),
bool center =
false );
207 enum LineOperationDirection
212 template <
class BlockOperation>
static void runBlockOperationInThreads( QImage &image, BlockOperation &operation, LineOperationDirection direction );
215 unsigned int beginLine;
216 unsigned int endLine;
217 unsigned int lineLength;
218 QImage *image =
nullptr;
222 template <
typename RectOperation>
static void runRectOperation( QImage &image, RectOperation &operation );
223 template <
class RectOperation>
static void runRectOperationOnWholeImage( QImage &image, RectOperation &operation );
226 template <
class PixelOperation>
static void runPixelOperation( QImage &image, PixelOperation &operation );
227 template <
class PixelOperation>
static void runPixelOperationOnWholeImage( QImage &image, PixelOperation &operation );
228 template <
class PixelOperation>
229 struct ProcessBlockUsingPixelOperation
231 explicit ProcessBlockUsingPixelOperation( PixelOperation &operation )
232 : mOperation( operation ) { }
234 typedef void result_type;
236 void operator()( ImageBlock &block )
238 for (
unsigned int y = block.beginLine; y < block.endLine; ++y )
240 QRgb *ref =
reinterpret_cast< QRgb *
>( block.image->scanLine( y ) );
241 for (
unsigned int x = 0; x < block.lineLength; ++x )
243 mOperation( ref[x], x, y );
248 PixelOperation &mOperation;
252 template <
typename LineOperation>
static void runLineOperation( QImage &image, LineOperation &operation );
253 template <
class LineOperation>
static void runLineOperationOnWholeImage( QImage &image, LineOperation &operation );
254 template <
class LineOperation>
255 struct ProcessBlockUsingLineOperation
257 explicit ProcessBlockUsingLineOperation( LineOperation &operation )
258 : mOperation( operation ) { }
260 typedef void result_type;
262 void operator()( ImageBlock &block )
265 int bpl = block.image->bytesPerLine();
266 if ( mOperation.direction() == ByRow )
268 for (
unsigned int y = block.beginLine; y < block.endLine; ++y )
270 QRgb *ref =
reinterpret_cast< QRgb *
>( block.image->scanLine( y ) );
271 mOperation( ref, block.lineLength, bpl );
277 unsigned char *ref = block.image->scanLine( 0 ) + 4 * block.beginLine;
278 for (
unsigned int x = block.beginLine; x < block.endLine; ++x, ref += 4 )
280 mOperation( reinterpret_cast< QRgb * >( ref ), block.lineLength, bpl );
285 LineOperation &mOperation;
291 class GrayscalePixelOperation
298 void operator()( QRgb &rgb,
int x,
int y );
303 static void grayscaleLightnessOp( QRgb &rgb );
304 static void grayscaleLuminosityOp( QRgb &rgb );
305 static void grayscaleAverageOp( QRgb &rgb );
308 class BrightnessContrastPixelOperation
311 BrightnessContrastPixelOperation(
const int brightness,
const double contrast )
312 : mBrightness( brightness )
313 , mContrast( contrast )
316 void operator()( QRgb &rgb,
int x,
int y );
324 class HueSaturationPixelOperation
327 HueSaturationPixelOperation(
const double saturation,
const bool colorize,
328 const int colorizeHue,
const int colorizeSaturation,
329 const double colorizeStrength )
330 : mSaturation( saturation )
331 , mColorize( colorize )
332 , mColorizeHue( colorizeHue )
333 , mColorizeSaturation( colorizeSaturation )
334 , mColorizeStrength( colorizeStrength )
337 void operator()( QRgb &rgb,
int x,
int y );
343 int mColorizeSaturation;
344 double mColorizeStrength;
346 static int adjustColorComponent(
int colorComponent,
int brightness,
double contrastFactor );
349 class MultiplyOpacityPixelOperation
352 explicit MultiplyOpacityPixelOperation(
const double factor )
356 void operator()( QRgb &rgb,
int x,
int y );
362 class ConvertToArrayPixelOperation
365 ConvertToArrayPixelOperation(
const int width,
double *array,
const bool exterior =
true )
368 , mExterior( exterior )
372 void operator()( QRgb &rgb,
int x,
int y );
376 double *mArray =
nullptr;
380 class ShadeFromArrayOperation
383 ShadeFromArrayOperation(
const int width,
double *array,
const double spread,
388 , mProperties( properties )
390 mSpreadSquared = std::pow( mSpread, 2.0 );
393 void operator()( QRgb &rgb,
int x,
int y );
397 double *mArray =
nullptr;
399 double mSpreadSquared;
402 static void distanceTransform2d(
double *im,
int width,
int height );
403 static void distanceTransform1d(
double *f,
int n,
int *v,
double *z,
double *d );
404 static double maxValueInDistanceTransformArray(
const double *array,
unsigned int size );
407 class StackBlurLineOperation
410 StackBlurLineOperation(
int alpha, LineOperationDirection direction,
bool forwardDirection,
int i1,
int i2 )
412 , mDirection( direction )
413 , mForwardDirection( forwardDirection )
418 typedef void result_type;
420 LineOperationDirection direction() {
return mDirection; }
422 void operator()( QRgb *startRef,
int lineLength,
int bytesPerLine )
424 unsigned char *p =
reinterpret_cast< unsigned char *
>( startRef );
426 int increment = ( mDirection == QgsImageOperation::ByRow ) ? 4 : bytesPerLine;
427 if ( !mForwardDirection )
429 p += ( lineLength - 1 ) * increment;
430 increment = -increment;
433 for (
int i = mi1; i <= mi2; ++i )
439 for (
int j = 1; j < lineLength; ++j, p += increment )
441 for (
int i = mi1; i <= mi2; ++i )
443 p[i] = ( rgba[i] += ( ( p[i] << 4 ) - rgba[i] ) * mAlpha / 16 ) >> 4;
450 LineOperationDirection mDirection;
451 bool mForwardDirection;
456 static double *createGaussianKernel(
int radius );
458 class GaussianBlurOperation
461 GaussianBlurOperation(
int radius, LineOperationDirection direction, QImage *destImage,
double *kernel )
463 , mDirection( direction )
464 , mDestImage( destImage )
465 , mDestImageBpl( destImage->bytesPerLine() )
469 typedef void result_type;
471 void operator()( ImageBlock &block );
475 LineOperationDirection mDirection;
476 QImage *mDestImage =
nullptr;
478 double *mKernel =
nullptr;
480 inline QRgb gaussianBlurVertical(
int posy,
unsigned char *sourceFirstLine,
int sourceBpl,
int height );
481 inline QRgb gaussianBlurHorizontal(
int posx,
unsigned char *sourceFirstLine,
int width );
487 class FlipLineOperation
490 explicit FlipLineOperation( LineOperationDirection direction )
491 : mDirection( direction )
494 typedef void result_type;
496 LineOperationDirection direction() {
return mDirection; }
498 void operator()( QRgb *startRef,
int lineLength,
int bytesPerLine );
501 LineOperationDirection mDirection;
507 #endif // QGSIMAGEOPERATION_H Flip the image horizontally.
Contains operations and filters which apply to QImages.
Keep the lightness of the color, drops the saturation.
Abstract base class for color ramps.
FlipType
Flip operation types.
Grayscale by perceptual luminosity (weighted sum of color RGB components)
Grayscale by taking average of color RGB components.
GrayscaleMode
Modes for converting a QImage to grayscale.