Мне нужно отрисовать только вектор SVG без сглаживания в Qt; в частности, я не хочу, чтобы полученное изображение содержало какие-либо цвета, которые не были точно такими, как указано в исходном файле.
При загрузке SVG в QImage
, Qt по умолчанию использует сглаживание; даже при явном использовании QSvgRenderer::render
подсказка рендеринга QPainter::Antialiasing
игнорируется.
Это оказывается очевидным, поскольку QSVGTinyDocument::draw
, который, похоже, является тем, кто фактически начинает рисование, заставляет его установить :
//sets default style on the painter
//### not the most optimal way
mapSourceToTarget(p, bounds);
QPen pen(Qt::NoBrush, 1, Qt::SolidLine, Qt::FlatCap, Qt::SvgMiterJoin);
pen.setMiterLimit(4);
p->setPen(pen);
p->setBrush(Qt::black);
p->setRenderHint(QPainter::Antialiasing);
p->setRenderHint(QPainter::SmoothPixmapTransform);
Чтобы обойти это, я попытался создать пользовательский QPaintEngine
, обертывающий стандартный по умолчанию (а затем подкласс даже QImage
для возврата оболочки QPaintEngine
в виртуальном методе paintEngine()
), но я не смог найти ни одного чистый способ перехватить и изменить подсказку рендеринга на пути к фактическому QPaintEngine
.
Метод QPaintEngine::update()
, который, по-видимому, является способом, посредством которого QPaintEngine
получает флаги, получает ссылку на QPaintEngineState
, который является ужасным кладжем, который предоставляет только геттеры, которые, в свою очередь,
- не
virtual
, поэтому вы не можете предоставить свою реализацию;
- внутренне просто предполагает, что он на самом деле работает с экземпляром внутреннего подкласса (
QPainterState
) , жестоко приводя указатель this
и получая доступ к его полям.
Кроме того, даже простое предоставление QPaintEngine
привело к появлению ошибок в недрах кода QPainter
, поэтому я быстро отказался.
Короче говоря:
- есть ли способ принудительно отключить / перехватить и игнорировать / ... подсказку
QPainter::Antialiasing
рендеринга для QPainter
? (переменная окружения QT_NO_ANTIALIASING
не считается, поскольку она включена только в сборках без QT_NO_DEBUG
);
- В общем, как я могу отрисовать SVG на
QImage
без сглаживания?