尽管我正在阻止它,但QImage会出现错误

时间:2015-07-04 19:01:00

标签: c++ qt qgraphicsview qimage

我正在玩QImage和QGraphics视图。我试图计算两幅图像之间的欧氏距离,我知道它很慢但没关系,我得到了这个错误

ASSERT failure in QVector<T>::at: "index out of range", file c:\work\build\qt5_workdir\w\s\qtbase\include\qtcore\../../src/corelib/tools/qvector.h, line 377

每当我通过这些行

for(int row = 0; row < 128 ; row++){
    for(int col = 0; col < 128; col++){
        if(this->Imagem->valid(row, col)){
            qDebug() << "1";
            this->Imagem->pixel(row, col);
        }
        else
            qDebug() << "2";
    }
}

它总是在终端输出“1”并崩溃。我正在用

声明图像
this->Imagem = new QImage(128, 128, QImage::Format_Indexed8);
this->Imagem->fill(QColor(Qt::black).rgb());

我甚至会检查点是否在图像的边界内,而且显然是。

2 个答案:

答案 0 :(得分:2)

Format_Indexed8 使用手动定义的颜色表,其中每个索引代表一种颜色。在操作像素之前,您必须为图像设置颜色表:

#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator (HS))

或者您可以手动设置当前颜色表的每个索引:

QVector<QRgb> color_table;
for (int i = 0; i < 256; ++i) {
    color_table.push_back(qRgb(i, i, i)); // Fill the color table with B&W shades
}
Imagem->setColorTable(color_table);

如您所见, Format_Indexed8 像素值表示 RGB颜色,但索引值(表示您在颜色表中设置的颜色)。

如果您不想处理颜色表,可以使用其他格式,例如 Format_RGB32

答案 1 :(得分:0)

请注意,QImage::valid需要(col, row),而不是(row, col)(即第一个参数 X ,第二个 Y );但这不应该对128x128图像产生影响。

可能是您正在访问的对象已被销毁(例如,因为您对所有权的处理有问题),但如果没有看到更多代码,很难判断。