Qt在"debug"模式下正确渲染此SVG,但在"release"

Qt renders this SVG correctly in "debug" mode but not in "release"

本文关键字:SVG 但在 release debug 模式 Qt      更新时间:2023-10-16

我遇到了这个奇怪的问题,当我为调试构建并针对调试dlls(Qt 5.12.2,开源)链接时,我得到了预期的渲染。

当我为发布构建并针对发布 dll 链接时,图像完全空白。该程序从 MSVC 运行,因此应正确设置 dll 路径。有人知道发生了什么吗?

#include <QApplication>
#include <QSvgRenderer>
#include <QPainter>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//https://commons.wikimedia.org/wiki/File:USAF-1951.svg
QSvgRenderer renderer(QString("USAF-1951.svg"));
QImage image(512, 512, QImage::Format_Grayscale8);
QPainter painter(&image);
renderer.render(&painter);
image.save("USAF-1951.bmp");
return 0;
}

我尝试了其他一些SVG图像,它们似乎有效。不知道这张图片是怎么回事。

OP在他的自我回答中提供了正确的修复,但没有解释为什么这是必要的。所以,我会介入:

Qt文档关于QImage::QImage()

Q:

:Q测量仪(整数宽度,整数高度,QImage::格式格式)

构建具有给定宽度、高度和格式的图像。

如果无法分配内存,将返回空图像。

警告:这将创建一个包含未初始化数据的 QImage。调用 fill() 以在图像上绘制之前,使用适当的像素值填充图像。

(强调我的。

未初始化表示图像像素字节中可能存在任何值。如果全部为0s,则 alpha 值也将0s。这也许可以解释为什么什么都没有出现。

现在,一个额外的说明,为什么这可能在调试模式下工作:

OP明确提到了MSVC。MS 人员试图为调试提供最佳支持,并决定用诸如CD代表"已分配但尚未初始化"。(更多关于这一点:SO:在Visual Studio C++中,内存分配表示形式是什么?

有时,这真的很有帮助。将此位模式解释为floatdouble会产生非常奇怪的数字(通过一点经验很容易识别),并且十六进制视图中的整数值变得非常明显。

但是,这有一些缺点:未初始化的bool将始终"初始化"以在调试模式下(以某种方式)true,其中它在发布中具有任意值。 → 可以想象的最糟糕的事故:调试运行,但发布偶尔失败。(我最害怕的虫子。

在OP的情况下,它(可能)相似:在调试模式下,图像始终具有浅灰色背景,不透明度高到足以忽略释放模式下意外的透明度...见上文。(或者,OP可以得到一种噪音模式,就像过去午夜之后从电视上知道的那样。不确定,这是否进一步帮助...

所以很明显,如果我在调试和发布中都按预期设置背景。

#include <QApplication>
#include <QSvgRenderer>
#include <QPainter>
//https://stackoverflow.com/questions/55895293/qt-renders-this-svg-correctly-in-debug-mode-but-not-in-release
int main(int argc, char *argv[])
{
//https://commons.wikimedia.org/wiki/File:USAF-1951.svg
QApplication a(argc, argv);
QSvgRenderer renderer(QString("USAF-1951.svg"));
QImage image(512, 512, QImage::Format_Grayscale8);
image.fill(255);//<- Need to set background
QPainter painter(&image);
renderer.render(&painter);
image.save("Test.bmp");
return 0;
}
相关文章: