我遇到了这个怪异的问题,当我进行调试并针对调试dll(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图像,它们似乎可以正常工作。不知道这张图片怎么了。
答案 0 :(得分:1)
显然,如果我按调试和发行版中的预期设置背景,那么
#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;
}
答案 1 :(得分:1)
OP在他的self-answer中提供了正确的解决方案,但是没有解释为什么这样做是必要的。因此,我将介入:
Qt文档。关于QImage::QImage()
:
QImage::QImage(int width, int height, QImage::Format format)
以给定的宽度,高度和格式构造图像。
如果无法分配内存,将返回空图像。
警告:这将创建带有未初始化数据的QImage。调用fill(),以在使用QPainter绘制图像之前,用适当的像素值填充图像。
(强调我的。)
未初始化表示图像像素字节中可能有任何值。如果全部为0
,则alpha值也将为0
。那可以解释为什么什么都没出现。
现在,要另外说明为什么它可能在调试模式下起作用:
OP明确提到了MSVC。 MS专家们试图为调试提供最好的支持,并决定使用诸如的模式填充每个分配的内存(在调试模式下)。 CD
代表“已分配但尚未初始化”。 (有关更多信息,请访问SO: In Visual Studio C++, what are the memory allocation representations?。)
有时候,这确实很有帮助。将此位模式解释为float
或double
会产生非常奇怪的数字(有一点经验就很容易识别),并且十六进制视图中的整数值变得非常明显。
但是,这样做有一些缺点:未初始化的bool
将始终在调试模式下(以某种方式)被“初始化”为true
,在释放模式下它具有任意值。 →可以想象的最严重的事故:调试运行,但偶尔会释放失败。 (我最害怕的错误。)
在OP的情况下,它(可能)是相似的:在调试模式下,图像始终具有浅灰色背景,并且具有不透明度,该透明度足以在释放模式下忽略意外的透明度...参见上文。 (或者,OP可能会像过去午夜过后那样从电视上获得噪声模式。不确定是否进一步帮助了...)