QImage 出现错误,尽管我正在阻止它
QImage is getting an error eventhough I'm preventing it
我正在玩弄 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());
我什至在检查这些点是否在图像的边界内,而且很明显是这样。
注意 QImage::valid
需要 (col, row)
,而不是 (row, col)
(即第一个参数是 X,第二个 Y);然而,这对于 128x128 图像应该没有影响。
可能是您正在访问的对象已经被销毁(例如,因为您对所有权的处理有问题),但如果不查看更多代码就很难判断。
Format_Indexed8 使用手动定义的颜色 table,其中每个索引代表一种颜色。在操作像素之前,您必须为图像设置颜色 table:
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);
或者您可以手动设置当前颜色的每个索引table:
Imagem->setColorCount(4); // How many colors will be used for this image
Imagem->setColor(0, qRgb(255, 0, 0)); // Set index #0 to red
Imagem->setColor(1, qRgb(0, 0, 255)); // Set index #1 to blue
Imagem->setColor(2, qRgb(0, 0, 0)); // Set index #2 to black
Imagem->setColor(3, qRgb(255, 255, 0)); // Set index #3 to yellow
Imagem->fill(1); // Fill the image with color at index #1 (blue)
如您所见,Format_Indexed8 像素值代表 而不是 RGB 颜色,但索引值(又代表您在颜色 table).
中设置的颜色
如果你不想处理颜色 tables,你可以简单地使用另一种格式,例如 Format_RGB32.
我正在玩弄 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());
我什至在检查这些点是否在图像的边界内,而且很明显是这样。
注意 QImage::valid
需要 (col, row)
,而不是 (row, col)
(即第一个参数是 X,第二个 Y);然而,这对于 128x128 图像应该没有影响。
可能是您正在访问的对象已经被销毁(例如,因为您对所有权的处理有问题),但如果不查看更多代码就很难判断。
Format_Indexed8 使用手动定义的颜色 table,其中每个索引代表一种颜色。在操作像素之前,您必须为图像设置颜色 table:
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);
或者您可以手动设置当前颜色的每个索引table:
Imagem->setColorCount(4); // How many colors will be used for this image
Imagem->setColor(0, qRgb(255, 0, 0)); // Set index #0 to red
Imagem->setColor(1, qRgb(0, 0, 255)); // Set index #1 to blue
Imagem->setColor(2, qRgb(0, 0, 0)); // Set index #2 to black
Imagem->setColor(3, qRgb(255, 255, 0)); // Set index #3 to yellow
Imagem->fill(1); // Fill the image with color at index #1 (blue)
如您所见,Format_Indexed8 像素值代表 而不是 RGB 颜色,但索引值(又代表您在颜色 table).
中设置的颜色如果你不想处理颜色 tables,你可以简单地使用另一种格式,例如 Format_RGB32.