我正在尝试为 Qt5 中的 qwebview 创建色度键。这意味着我需要使特定颜色透明(其他小部件应该通过具有该颜色的 webview 像素可见)。我发现它可以使用 QPainter::CompositionMode 操作来完成,但不能让它工作。
例如,我需要让 webview 的所有黑色像素都是透明的(应该在运行时更改源颜色)。
我在课堂上重新实现了 QWebView::paintEvent(从 Qt 源代码中获取部分代码),但不知道下一步该做什么
WebView::paintEvent(QPaintEvent *event) {
if (!page()) return;
QWebFrame *frame = page()->mainFrame();
QPainter painter(this);
painter.setRenderHints(renderHints());
painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
frame->render(&painter, event->region());
}
我找到了一种使用以下代码使任何源颜色变为白色的方法:
QWebFrame *frame = page()->mainFrame();
QImage source_image(size(), QImage::Format_ARGB32_Premultiplied);
QImage result_image(size(), QImage::Format_ARGB32_Premultiplied);
QPainter imagePainter(&source_image);
imagePainter.setRenderHints(renderHints());
frame->render(&imagePainter, event->region());
imagePainter.end();
QImage mask = source_image.createMaskFromColor(qRgb(0x00,0x00,0x00)); // Source color
QPainter resultPainter(&result_image);
resultPainter.drawImage(source_image.rect(), source_image);
resultPainter.setCompositionMode(QPainter::CompositionMode_Screen);
resultPainter.drawImage(source_image.rect(), mask);
QPainter painter(this);
painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
painter.drawImage(0, 0, result_image);
但我不知道如何将白色转换为透明。