QPainter: как добавить текст без артефактов в шрифте

Рейтинг: 1Ответов: 2Опубликовано: 28.03.2023

Qt5, C++. Программно рисую картинку, на которую необходимо добавить текстовое содержимое. Какой бы шрифт не использовал - на выходе получаю артефактные гличи: буквы испещрены точками, неточностями, "шумом".

Краткий пример моего кода и скриншот:

    m_font.setFamily(family);
    m_font.setPointSize(FONT_SIZE);
    m_font.setBold(true);


    QPainterPath path;
    QFontMetrics fm(m_font);
    path.addText(0, fm.height(), m_font, "LOREM IPSUM");

    QPainter painter;
    painter.begin(&img);
    painter.setBrush(Qt::black);
    painter.drawPath(path);
    painter.end();

Скриншот

Пробовал играться с масштабом - большого толку нет: увеличил изображение и шрифт в 10 раз, а при выводе картинки использовал QImage::scaled(X, Y). Скриншот:

Попытка с масштабированием

Как получить "гладкое" начертание букв на итоговой картинке?

Ответы

▲ 3Принят

Не надо использовать для такой задачи QPainterPath

Вот такой сниппет я использовал для тестирования

QFont font;
font.setPointSize(52);
font.setBold(true);

QString example = "LOREM IPSUM 1234567890$%^";

QPainterPath path;
QFontMetrics fm(font);
path.addText(0, fm.height(), font, example);

QImage img(900, 200, QImage::Format_ARGB32);
img.fill(Qt::white);

QPainter painter;
painter.begin(&img);
painter.setBrush(Qt::black);
painter.drawPath(path);

painter.setFont(font);
painter.drawText(QPointF(0, fm.height() * 2), example);

painter.end();

И вот результат. Верхняя надпись как у вас, нижняя drawText

результат

▲ 1

Задал Render hint объекту QPainter:

painter.setRenderHint(QPainter::Antialiasing);

введите сюда описание изображения

Стало значительно лучше.