Qt правильно отображает этот SVG в режиме «отладки», но не в «выпуске» - PullRequest
1 голос
/ 29 апреля 2019

У меня возникла эта странная проблема, когда я собираюсь для отладки и связывания с dll отладки (Qt 5.12.2, с открытым исходным кодом), я получаю ожидаемый рендеринг.изображение полностью пустое.Программа запускается из 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, и они, кажется, работают.Не уверен, что случилось с этим изображением.

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

ОП предоставил правильное исправление в своем самоответе , но упустил объяснение, почему это необходимо. Итак, я вступлю:

Qt Doc. о QImage::QImage():

QImage :: QImage (int width, int height, QImage :: Format format)

Создает изображение с заданной шириной, высотой и форматом.

Нулевое изображение будет возвращено, если память не может быть выделена.

Предупреждение: это создаст QImage с неинициализированными данными. Вызовите fill () , чтобы заполнить изображение соответствующим значением пикселя, прежде чем рисовать на нем с помощью QPainter.

(Подчеркните мое.)

Неинициализированный означает, что может быть любое значение в байтах пикселя изображения. Если бы это были все 0 с, значения альфа также были бы 0 с. Это может объяснить, почему ничего не появилось.

Теперь еще одно примечание, почему это могло работать в режиме отладки:

OP упоминается явно MSVC. Ребята из MS постарались обеспечить лучшую поддержку для отладки и решили заполнить каждую выделенную память (в режиме отладки) шаблонами, например CD означает «выделено, но еще не инициализировано». (Подробнее об этом здесь: SO: Что такое представления выделения памяти в Visual Studio C ++? .)

Иногда это действительно полезно. Интерпретация этого битового шаблона как float или double приводит к довольно странным числам (легко распознаваемым с небольшим опытом), и целочисленные значения в шестнадцатеричном представлении становятся совершенно очевидными.

Однако у этого есть некоторые недостатки: неинициализированный bool всегда будет "инициализирован" в true в режиме отладки (каким-то образом), где он имеет произвольные значения в выпуске. & Rarr; Самая страшная авария: отладка запускается, но выпуск происходит не всегда. (Мои самые ошибочные ошибки.)

В случае OP это (вероятно) похоже: в режиме отладки изображение всегда имеет светло-серый фон с непрозрачностью, которая достаточно высока, чтобы игнорировать неожиданную прозрачность в режиме выпуска ... см. Выше. (В качестве альтернативы, ОП мог получить шумовую картину, такую ​​же, как известную по телевидению после полуночи в прошлом. Не уверен, помогло ли это в дальнейшем ...)

1 голос
/ 29 апреля 2019

Так что, очевидно, если я установлю фон в работах, как ожидалось, и в отладке, и в выпуске.

#include <QApplication>
#include <QSvgRenderer>
#include <QPainter>
///9093750/qt-pravilno-otobrazhaet-etot-svg-v-rezhime-otladki-no-ne-v-vypuske
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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...