Изменение размера изображения - PullRequest
4 голосов
/ 02 декабря 2011

Я пишу небольшой графический редактор и мне нужна помощь. Я рисую QImage так:

void Editor::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);

    // zoom is an int, representing zoomFactor from 1 to 12.
    painter.drawImage(
        QRect(0, 0, image.width() * zoom , image.height() * zoom),
        image);

    if (zoom >= 3 && showGrid) {
        painter.setPen(palette().foreground().color());
        painter.setPen(Qt::DotLine);

        // this is how I draw grid
        for (int i = 0; i <= image.width(); ++i)
            painter.drawLine(zoom * i, 0,
                zoom * i, zoom * image.height());
        for (int j = 0; j <= image.height(); ++j)
            painter.drawLine(0, zoom * j,
                zoom * image.width(), zoom * j); 
    }

    // (...)
} 

Отлично работает с такими изображениями (16 x 16) 1

Проблемы начинаются, когда я открываю подобные изображения (25 X 28)

2

Как видите, пиксели нарисованы с разной шириной и высотой! Что я делаю неправильно? Пожалуйста, помогите:)

UPD: Проблема решена неожиданно. Я заметил, что Editor был QGLWidget, поэтому я попытался изменить его на QWidget, и все работало просто отлично. Глупый я -_- Кстати, может быть, есть более удобные способы увеличения изображения? (Например, кадрированные пиксели, которые не нужно рисовать)

1 Ответ

1 голос
/ 03 декабря 2011

Код для обработки сильно увеличенных изображений был "оптимизирован" некоторое время назад в Qt, и теперь он, к сожалению, глючит. Я не проверял код, но мое странное предположение состоит в том, что «скорость» или «смещение» текстуры, использованные для рисования, были раньше вычислены в плавающей точке, а теперь вычисляются с использованием фиксированной точки.

Я не помню точно, с какой версией это было представлено, но это было довольно рано после 4.0. У нас есть одно из наших приложений, которое должно позволять размещать крест с точностью до субпикселя и масштабировать по точке, когда коэффициент масштабирования высок, вы можете заметить, что изображение «колеблется».

Я первый, кто не претендует на ошибку в коде кого-то другого, если не уверен на 100%, но это один из тех случаев, в которых я действительно уверен на 100%.

Единственный выход - нарисовать увеличенное изображение вручную, либо переопределив код отображения текстуры, либо (если вам нужен только int > 1 коэффициент масштабирования), рисуя один пиксель за раз с помощью drawRect ... это должно быть быстро достаточно на ПК.

Обратите внимание, что ошибка может быть общей ошибкой драйверов видео вместо ошибки в Qt ... Я видел, что проблема в нашем программном обеспечении присутствует на разных платформах (Windows / Linux / OsX) и действительно только в IIRC при использовании QWidget (а не при использовании QGLWidget).

...