[英]Qt renders this SVG correctly in “debug” mode but not in “release”
我遇到了這個奇怪的問題,當我構建調試和鏈接調試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圖像,它們似乎工作。 不確定這個圖像是什么。
OP在他的自我回答中提供了正確的解決方案,但錯過了解釋為什么這是必要的。 所以,我會介入:
Qt doc。 關於QImage::QImage()
:
QImage :: QImage(int width,int height,QImage :: Format format)
構造具有給定寬度,高度和格式的圖像。
如果無法分配內存,將返回空圖像。
警告:這將創建一個包含未初始化數據的QImage。 在使用QPainter繪制圖像之前,調用fill()以使用適當的像素值填充圖像。
(強調我的。)
未初始化意味着圖像像素字節中可能存在任何值。 如果它都是0
秒,那么alpha值也將是0
秒。 這可以解釋為什么沒有出現。
現在,另外要注意為什么這可能在調試模式下有效:
OP明確提到了MSVC。 MS人員試圖為調試提供最好的支持,並決定用例如CD
代表“已分配但尚未初始化”的模式填充每個分配的內存(在調試模式下)。 (有關此內容的更多信息: SO:在Visual Studio C ++中,內存分配表示是什么? )
有時,它真的很有幫助。 將此位模式解釋為float
或double
產生非常奇怪的數字(通過一點點經驗很容易識別),並且十六進制視圖中的積分值變得非常明顯。
但是,這有一些缺點:未初始化的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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.