奇怪的QImage比较结果

时间:2014-05-06 14:57:18

标签: opengl qimage

我想在我的OpenGL应用程序上运行一些单元测试。这导致我过去的一些问题(OpenGL draw difference between 2 computers),但现在我知道我能做什么,不能做什么。

这是我为检查渲染而编写的一个小测试:

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比较文件(参见photo.stackexchange),我找不到任何不同的像素。我有点失落。

编辑:我正在使用Qt 5.2,如果我在file_010.bmp上手动更改一个像素,则会显示错误消息"different pixel detected" << i << j

1 个答案:

答案 0 :(得分:1)

如果图像具有不同的格式,不同的大小和/或不同的内容,QImage相等运算符将报告两个QImage实例是不同的。为了让其他人可能无法理解为什么两个QImage实例不同,下面的函数会打印出差异是什么(尽管如果有很多不同的像素,它可能会产生很多输出): / p>

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));
            }
        }
    }
}