我正在玩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());
我甚至会检查点是否在图像的边界内,而且显然是。
答案 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图像产生影响。
可能是您正在访问的对象已被销毁(例如,因为您对所有权的处理有问题),但如果没有看到更多代码,很难判断。