22#include <QRegularExpression> 
   35    return QStringLiteral( 
"1.3.0" );
 
 
   46      static const QSet<QString> sFilter {
 
   47        QStringLiteral( 
"REQUEST" ),
 
   48        QStringLiteral( 
"VERSION" ),
 
   49        QStringLiteral( 
"SERVICE" ),
 
   50        QStringLiteral( 
"LAYERS" ),
 
   51        QStringLiteral( 
"STYLES" ),
 
   52        QStringLiteral( 
"SLD_VERSION" ),
 
   53        QStringLiteral( 
"_DC" )
 
   59      const QList<QPair<QString, QString>> queryItems = q.queryItems();
 
   60      for ( 
const QPair<QString, QString> ¶m : queryItems )
 
   62        if ( sFilter.contains( param.first.toUpper() ) )
 
   63          q.removeAllQueryItems( param.first );
 
 
   75    if ( format.compare( QLatin1String( 
"png" ), Qt::CaseInsensitive ) == 0 || format.compare( QLatin1String( 
"image/png" ), Qt::CaseInsensitive ) == 0 )
 
   79    else if ( format.compare( QLatin1String( 
"jpg " ), Qt::CaseInsensitive ) == 0 || format.compare( QLatin1String( 
"image/jpeg" ), Qt::CaseInsensitive ) == 0 )
 
   83    else if ( format.compare( QLatin1String( 
"webp" ), Qt::CaseInsensitive ) == 0 || format.compare( QLatin1String( 
"image/webp" ), Qt::CaseInsensitive ) == 0 )
 
   90      const thread_local QRegularExpression modeExpr = QRegularExpression( QStringLiteral( 
"image/png\\s*;\\s*mode=([^;]+)" ), QRegularExpression::CaseInsensitiveOption );
 
   92      const QRegularExpressionMatch match = modeExpr.match( format );
 
   93      const QString mode = match.captured( 1 );
 
   94      if ( mode.compare( QLatin1String( 
"16bit" ), Qt::CaseInsensitive ) == 0 )
 
   96      if ( mode.compare( QLatin1String( 
"8bit" ), Qt::CaseInsensitive ) == 0 )
 
   98      if ( mode.compare( QLatin1String( 
"1bit" ), Qt::CaseInsensitive ) == 0 )
 
 
  112    switch ( outputFormat )
 
  116        contentType = QStringLiteral( 
"image/png" );
 
  117        saveFormat = QStringLiteral( 
"PNG" );
 
  121        QVector<QRgb> colorTable;
 
  126        const QImage img256 = img.convertToFormat( QImage::Format_ARGB32 );
 
  128        result = img256.convertToFormat( QImage::Format_Indexed8, colorTable, Qt::ColorOnly | Qt::ThresholdDither | Qt::ThresholdAlphaDither | Qt::NoOpaqueDetection );
 
  130        contentType = QStringLiteral( 
"image/png" );
 
  131        saveFormat = QStringLiteral( 
"PNG" );
 
  134        result = img.convertToFormat( QImage::Format_ARGB4444_Premultiplied );
 
  135        contentType = QStringLiteral( 
"image/png" );
 
  136        saveFormat = QStringLiteral( 
"PNG" );
 
  139        result = img.convertToFormat( QImage::Format_Mono, Qt::MonoOnly | Qt::ThresholdDither | Qt::ThresholdAlphaDither | Qt::NoOpaqueDetection );
 
  140        contentType = QStringLiteral( 
"image/png" );
 
  141        saveFormat = QStringLiteral( 
"PNG" );
 
  145        contentType = QStringLiteral( 
"image/jpeg" );
 
  146        saveFormat = QStringLiteral( 
"JPEG" );
 
  150        contentType = QStringLiteral( 
"image/webp" );
 
  151        saveFormat = QStringLiteral( 
"WEBP" );
 
  155        saveFormat = QStringLiteral( 
"Unknown" );
 
  160    result.setDotsPerMeterX( img.dotsPerMeterX() );
 
  161    result.setDotsPerMeterY( img.dotsPerMeterY() );
 
  165      response.
setHeader( 
"Content-Type", contentType );
 
  166      if ( saveFormat == QLatin1String( 
"JPEG" ) || saveFormat == QLatin1String( 
"WEBP" ) )
 
  168        result.save( response.
io(), qPrintable( saveFormat ), imageQuality );
 
  172        result.save( response.
io(), qPrintable( saveFormat ) );
 
  178      parameter.
mValue = formatStr;
 
 
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true, const char *file=__builtin_FILE(), const char *function=__builtin_FUNCTION(), int line=__builtin_LINE())
Adds a message to the log instance (and creates it if necessary).
 
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
 
static QgsProject * instance()
Returns the QgsProject singleton instance.
 
static QString wmsServiceUrl(const QgsProject &project, const QgsServerRequest &request=QgsServerRequest(), const QgsServerSettings &settings=QgsServerSettings())
Returns the WMS service url.
 
Defines requests passed to QgsService classes.
 
QUrl originalUrl() const
Returns the request url as seen by the web server, by default this is equal to the url seen by QGIS s...
 
Defines the response interface passed to QgsService.
 
virtual void setHeader(const QString &key, const QString &value)=0
Set Header entry Add Header entry to the response Note that it is usually an error to set Header afte...
 
virtual QIODevice * io()=0
Returns the underlying QIODevice.
 
Provides a way to retrieve settings by prioritizing according to environment variables,...
 
Exception thrown in case of malformed request.
 
WMS parameter received from the client.
 
Median cut implementation.
 
void writeImage(QgsServerResponse &response, QImage &img, const QString &formatStr, int imageQuality)
Write image response.
 
void medianCut(QVector< QRgb > &colorTable, int nColors, const QImage &inputImage)
Median cut implementation used when reducing RGB colors to palletized colors.
 
QString implementationVersion()
Returns the highest version supported by this implementation.
 
ImageOutputFormat
Supported image output format.
 
@ Unknown
Unknown/invalid format.
 
ImageOutputFormat parseImageFormat(const QString &format)
Parse image format parameter.
 
QUrl serviceUrl(const QgsServerRequest &request, const QgsProject *project, const QgsServerSettings &settings)
Returns WMS service URL.