Странный результат сравнения QImage

Я хочу запустить несколько модульных тестов в своем приложении OpenGL. Это вызывало у меня несколько проблем в прошлом (разница в отрисовке OpenGL между двумя компьютерами ) но теперь я знаю, что я могу и не могу делать.

Вот небольшой тест, который я написал для проверки рендеринга:

QImage display(grabFrameBuffer());
QImage wanted(PATH_TO_RESSOURCES + "/file_010.bmp");

int Qimage_width = display.width();
int Qimage_height = display.height();
for(int i = 1; i < Qimage_width; i++) {
    for(int j = 1; j < Qimage_height; j++) {
        if(QColor(display.pixel(i, j)).name() != QColor(wanted.pixel(i, j)).name()) {
            qDebug() << "different pixel detected" << i << j;
        }
    }
}
QVERIFY(wanted == display);

QVERIFY() завершается ошибкой, но сообщение "different pixel detected" << i << j никогда не отображается. Если я сравню файлы с Photoshop (см. фото .stackexchange), я не могу найти другой пиксель. Я немного потерян.

Редактировать: я использую Qt 5.2, и если я вручную изменяю один пиксель в файле_010.bmp, отображается сообщение об ошибке "different pixel detected" << i << j.


person Thomas Ayoub    schedule 06.05.2014    source источник
comment
Вы уверены, что сравнение свойства name() уместно?   -  person Martin Delille    schedule 06.05.2014
comment
@MartinDelille name() возвращает шестнадцатеричный код цвета (например: #00ff00), если код отличается, пиксель не совпадает.   -  person Thomas Ayoub    schedule 06.05.2014
comment
Вместо этого попробуйте сравнить цветовой компонент: QColor::red(), QColor::blue() и QColor::green()   -  person Martin Delille    schedule 06.05.2014
comment
Может разница в другом параметре?   -  person Martin Delille    schedule 06.05.2014
comment
Вы не упомянули, какой инструментарий используете, но я полагаю, что QImage взят отсюда: qt-project.org/doc/qt-4.8/qimage.html#operator-eq-eq. В нем говорится, что operator== будет считать изображения неравными, если формат отличается. Я подозреваю, что grabFrameBuffer() может дать вам изображение в формате, отличном от чтения BMP.   -  person Reto Koradi    schedule 06.05.2014
comment
Кстати, в QImage(+ PATH_TO_RESSOURCES, ... также есть что-то похожее на случайный знак +. Не уверен, как это компилируется. Не могли бы вы просто сравнить с wanted, что вы уже прочитали выше?   -  person Reto Koradi    schedule 06.05.2014
comment
@RetoKoradi Я использую Qt 5.2. Вы правы в том, что я должен сравнивать с wanted. + PATH... является опечаткой, а operator== работает с некоторыми другими файлами bmp по сравнению с Grabframebuffer().   -  person Thomas Ayoub    schedule 06.05.2014
comment
@ꜱᴀᴍᴏᴛʜ Исходный код QImage::operator== показывает, что он вернет false, если высота, ширина или формат двух изображений не идентичны. Даже если different pixel detected никогда не распечатывается, любая из этих вещей может отличаться.   -  person RA.    schedule 06.05.2014
comment
@РА. Я сравниваю изображения, которые идентичны. Кроме того, он работает с другими файлами bmp.   -  person Thomas Ayoub    schedule 06.05.2014
comment
@ꜱᴀᴍᴏᴛʜ Они явно не идентичны, если QVERIFY не работает. Вам нужно перепроверить, что высота, ширина и формат идентичны. Кроме того, вы не проверяете все пиксели в цикле for — индексы должны начинаться с 0, а не с 1.   -  person RA.    schedule 06.05.2014
comment
@РА. Проклятие. Ты прав. Ну, если вам нужна репутация ;)   -  person Thomas Ayoub    schedule 07.05.2014


Ответы (1)


Оператор равенства QImage сообщит, что два экземпляра QImage различны, если изображения имеют разные форматы, разные размеры и/или разное содержимое. Для удобства тех, у кого могут возникнуть проблемы с пониманием того, почему два экземпляра QImage различны, следующая функция выводит, в чем заключаются различия (хотя она может генерировать много вывода, если имеется много разных пикселей):

void displayDifferencesInImages(const QImage& image1, const QImage& image2)
{
    if (image1 == image2)
    {
        qDebug("Images are identical");
        return;
    }

    qDebug("Found the following differences:");
    if (image1.size() != image2.size())
    {
        qDebug("    - Image sizes are different (%dx%d vs. %dx%d)",
               image1.width(), image1.height(),
               image2.width(), image2.height());
    }
    if (image1.format() != image2.format())
    {
        qDebug("    - Image formats are different (%d vs. %d)",
               static_cast<int>(image1.format()), 
               static_cast<int>(image2.format()));
    }

    int smallestWidth = qMin(image1.width(), image2.width());
    int smallestHeight = qMin(image1.height(), image2.height());

    for (int i=0; i<smallestWidth; ++i)
    {
        for (int j=0; j<smallestHeight; ++j)
        {
            if (image1.pixel(i, j) != image2.pixel(i, j))
            {
                qDebug("    - Image pixel (%d, %d) is different (%x vs. %x)",
                       i, j, image1.pixel(i, j), image2.pixel(i, j));
            }
        }
    }
}
person RA.    schedule 07.05.2014