22#include <QRegularExpression>
35 return QStringLiteral(
"1.3.0" );
46 static const QSet<QString> sFilter
48 QStringLiteral(
"REQUEST" ),
49 QStringLiteral(
"VERSION" ),
50 QStringLiteral(
"SERVICE" ),
51 QStringLiteral(
"LAYERS" ),
52 QStringLiteral(
"STYLES" ),
53 QStringLiteral(
"SLD_VERSION" ),
54 QStringLiteral(
"_DC" )
60 const QList<QPair<QString, QString> > queryItems = q.queryItems();
61 for (
const QPair<QString, QString> ¶m : queryItems )
63 if ( sFilter.contains( param.first.toUpper() ) )
64 q.removeAllQueryItems( param.first );
76 if ( format.compare( QLatin1String(
"png" ), Qt::CaseInsensitive ) == 0 ||
77 format.compare( QLatin1String(
"image/png" ), Qt::CaseInsensitive ) == 0 )
81 else if ( format.compare( QLatin1String(
"jpg " ), Qt::CaseInsensitive ) == 0 ||
82 format.compare( QLatin1String(
"image/jpeg" ), Qt::CaseInsensitive ) == 0 )
86 else if ( format.compare( QLatin1String(
"webp" ), Qt::CaseInsensitive ) == 0 ||
87 format.compare( QLatin1String(
"image/webp" ), Qt::CaseInsensitive ) == 0 )
94 const thread_local QRegularExpression modeExpr = QRegularExpression( QStringLiteral(
"image/png\\s*;\\s*mode=([^;]+)" ),
95 QRegularExpression::CaseInsensitiveOption );
97 const QRegularExpressionMatch match = modeExpr.match( format );
98 const QString mode = match.captured( 1 );
99 if ( mode.compare( QLatin1String(
"16bit" ), Qt::CaseInsensitive ) == 0 )
101 if ( mode.compare( QLatin1String(
"8bit" ), Qt::CaseInsensitive ) == 0 )
103 if ( mode.compare( QLatin1String(
"1bit" ), Qt::CaseInsensitive ) == 0 )
118 switch ( outputFormat )
122 contentType = QStringLiteral(
"image/png" );
123 saveFormat = QStringLiteral(
"PNG" );
127 QVector<QRgb> colorTable;
132 const QImage img256 = img.convertToFormat( QImage::Format_ARGB32 );
134 result = img256.convertToFormat( QImage::Format_Indexed8, colorTable,
135 Qt::ColorOnly | Qt::ThresholdDither |
136 Qt::ThresholdAlphaDither | Qt::NoOpaqueDetection );
138 contentType = QStringLiteral(
"image/png" );
139 saveFormat = QStringLiteral(
"PNG" );
142 result = img.convertToFormat( QImage::Format_ARGB4444_Premultiplied );
143 contentType = QStringLiteral(
"image/png" );
144 saveFormat = QStringLiteral(
"PNG" );
147 result = img.convertToFormat( QImage::Format_Mono,
148 Qt::MonoOnly | Qt::ThresholdDither |
149 Qt::ThresholdAlphaDither | Qt::NoOpaqueDetection );
150 contentType = QStringLiteral(
"image/png" );
151 saveFormat = QStringLiteral(
"PNG" );
155 contentType = QStringLiteral(
"image/jpeg" );
156 saveFormat = QStringLiteral(
"JPEG" );
160 contentType = QStringLiteral(
"image/webp" );
161 saveFormat = QStringLiteral(
"WEBP" );
165 saveFormat = QStringLiteral(
"Unknown" );
170 result.setDotsPerMeterX( img.dotsPerMeterX() );
171 result.setDotsPerMeterY( img.dotsPerMeterY() );
175 response.
setHeader(
"Content-Type", contentType );
176 if ( saveFormat == QLatin1String(
"JPEG" ) || saveFormat == QLatin1String(
"WEBP" ) )
178 result.save( response.
io(), qPrintable( saveFormat ), imageQuality );
182 result.save( response.
io(), qPrintable( saveFormat ) );
188 parameter.
mValue = formatStr;
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true)
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.
QgsServerRequest Class defining request interface passed to services QgsService::executeRequest() met...
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...
QgsServerResponse Class defining response interface passed to services QgsService::executeRequest() m...
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.
SERVER_EXPORT QString wmsServiceUrl(const QgsProject &project, const QgsServerRequest &request=QgsServerRequest(), const QgsServerSettings &settings=QgsServerSettings())
Returns the WMS service url.
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.