2017-02-17 2 views
1

У меня проблема с QPainter на QImage в Qt 5.4.Почему цвет пикселей с обратным отсчетом отличается от цвета, нарисованного на QImage?

Изображение Format_ARGB32. Я хочу установить заданное значение RGBA для пикселей на изображении с помощью функции выделения QPainter, а затем прочитать значение обратно с помощью QImage::pixel.

Однако значение, окрашенное и возвращаемое значение, отличается. Что я делаю не так?

Пример кода:

QImage image(100, 100, QImage::Format_ARGB32); 
uint value = 0x44fa112b; //some value.. 
QPainter painter(&image); 
painter.setCompositionMode(QPainter::CompositionMo de_Source); 
QColor color(qRed(value), qGreen(value), qBlue(value), qAlpha(value)); 
QBrush brush(color); 
painter.setBrush(brush); 
painter.drawRect(0,0,image.width(), image.height()); 

uint value1 = image.pixel(50,50); 
// value1 IS NOT EQUAL TO value. Why?? 
+0

Обратите внимание, что для заполнения изображения значением вы можете просто использовать QImage :: fill. Тогда какова ценность, которую вы получаете в итоге? – peppe

+0

Fill работает правильно (возвращаемое значение цвета используется для заполнения). Но в моем случае у меня есть разные значения, которые нужно нарисовать на изображении и прочитать; ни одного значения. Есть идеи? – rajeshma

+1

Код как опубликованный (с режимом композиции 'QPainter :: CompositionMode_Source') работает так, как ожидалось для меня. –

ответ

0

Это прекрасно работает в Qt 5.7. Возможно, более ранние версии Qt нуждаются в вызове painter.end().

#include <QtGui> 
int main(int argc, char ** argv) { 
    QGuiApplication app{argc, argv}; 
    QImage image{100, 100, QImage::Format_ARGB32}; 
    auto const set = 0x44fa112b; 
    QPainter painter(&image); 
    painter.setCompositionMode(QPainter::CompositionMode_Source); 
    painter.setBrush({{qRed(set), qGreen(set), qBlue(set), qAlpha(set)}}); 
    painter.drawRect(image.rect()); 
    if (false) painter.end(); //<< try with true here 
    auto readback = image.pixel(50,50); 
    qDebug() << hex << set << readback; 
    Q_ASSERT(readback == set); 
} 
+0

Обмен фактическим кодом и результатом. – rajeshma

+0

Я попробовал также с painter.end(). Нет разницы. Для входного значения = "44fa112b" выходное значение = "44fb1329" – rajeshma

0

Проблема решена! Правильно работает, когда я пытался с Qt 5.8 Похож на ошибку с Qt 5.4. Спасибо всем :)

Смежные вопросы