我想计算一堆像素,然后使用QtConcurrent::mappedReduced
将它们放入QImage中。但我得到QImage::setPixel: coordinate (636,442) out of range
错误。这可能是因为使用构造空图像的默认QImage构造函数。我没有在文档中找到任何方法来设置构造函数参数或如何为减少提供初始值。有什么方法可以做到这一点吗?我认为减少需要你指定初始值...就像在JS ......但Qt可能有不同的想法。
骨架:
struct Pixel{
QRgb value;
QPoint pos;
};
void reducer(QImage &result, const Pixel &pixel){
result.setPixel(pixel.pos,pixel.value);
}
我找到了一个解决方法......但是这段代码并不是最优的...因为现在每次减速器都运行时我都要检查...
void reducer(QImage &result, const Pixel &pixel, int width, int height){
if(result.width()==0)
result = QImage(width,height, QImage::Format_RGB888);
result.setPixel(pixel.pos,pixel.value);
}
...
auto boundReducer = std::bind(reducer,_1,_2,width,height);
答案 0 :(得分:0)
这个检查非常便宜,但是你的减速机做的工作很少,所以无论如何你都会遇到性能问题。
为了使它更清洁,检查图像是否为默认构造 - 即null,并将预期的初始图像作为参数传递,而不是传递宽度/高度。
void reducer(QImage &result, const Pixel &pixel, const QImage& initial) {
if (result.isNull())
result = initial;
result.setPixel(pixel.pos,pixel.value);
}
auto boundReducer = std::bind(reducer, _1, _2,
QImage(width,height,QImage::Format_RGB888));
您还可以使用派生自QImage
的类并知道如何默认构造自身,但要将运行时变量参数传递给此类,则需要使用静态成员变量。所以我认为这太糟糕了。