webp handler: improve quality-level handling

In lossless mode, libwebp interpretes the quality setting as a
compression-effort setting instead. The code used to set it to 100
(maximum), which could lead to unreasonable compression times (several
seconds for a small image). Instead set it to libweb's own default value.

Also, since the alpha channel compression has its own quality setting,
make sure it follows the main quality/effort setting.

Change-Id: I595d42c61f61c9932b27b185745bde6e7cfb3526
Reviewed-by: Liang Qi <liang.qi@qt.io>
This commit is contained in:
Eirik Aavitsland 2018-05-28 15:05:13 +02:00
parent b9ba221756
commit 9749e824a5
1 changed files with 9 additions and 2 deletions

View File

@ -248,8 +248,15 @@ bool QWebpHandler::write(const QImage &image)
return false; return false;
} }
config.quality = m_quality < 0 ? 75 : qMin(m_quality, 100); int reqQuality = m_quality < 0 ? 75 : qMin(m_quality, 100);
config.lossless = (config.quality >= 100); if (reqQuality < 100) {
config.lossless = 0;
config.quality = reqQuality;
} else {
config.lossless = 1;
config.quality = 70; // For lossless, specifies compression effort; 70 is libwebp default
}
config.alpha_quality = config.quality;
picture.writer = pictureWriter; picture.writer = pictureWriter;
picture.custom_ptr = device(); picture.custom_ptr = device();