C++ Qt:在QImage上迭代最具伸缩性的方法是什么?

C++ Qt:在QImage上迭代最具伸缩性的方法是什么?,c++,qt,qimage,pixel-manipulation,C++,Qt,Qimage,Pixel Manipulation,我知道有两种方法可以访问名为img的QImage中的所有像素 方法1 for (int y = 0; y < img.height(); y++) { QRgb *line = (QRgb *) img.scanline(y); for (int x = 0; x < img.width(); x++) { // line[x] has an individual pixel line[x] = QColor(255, 128, 0).

我知道有两种方法可以访问名为
img
QImage
中的所有像素

方法1

for (int y = 0; y < img.height(); y++) {
    QRgb *line = (QRgb *) img.scanline(y);
    for (int x = 0; x < img.width(); x++) {
        // line[x] has an individual pixel
        line[x] = QColor(255, 128, 0).rgb();
    }
}
for(int y=0;y
方法2

QRgb *st = (QRgb *) img.bits();
quint64 pixelCount = img.width() * img.height();

for (quint64 p = 0; p < pixelCount; p++) {
    // st[p] has an individual pixel
    st[p] = QColor(255, 128, 0).rgb();
}
QRgb*st=(QRgb*)img.bits();
quint64 pixelCount=img.width()*img.height();
对于(quint64 p=0;p

我热衷于使用第二种方法,因为它只涉及一个循环,但如果处理“足够大”的图像,我还担心
pixelCount
上可能出现的溢出

问题

迭代存储在
QImage
中的所有像素的最具伸缩性的方法是什么?所谓可伸缩性,我的意思是,无论图像尺寸(宽度和高度)是什么,它都能工作


注意:我已经意识到内存使用存在“物理”限制。我只是想知道这两种方法是否都能达到这样的极限。

“但我也担心,如果处理“足够大”的图像,pixelCount可能会出现溢出。我认为在处理大于4294967296x4294967296的图像时,首先会遇到其他限制:)这两种方法都会从隐式共享数据的任何其他QImage实例分离。因此,如果您不小心,它可能会创建一个额外的副本。否则,我看不到可伸缩性问题(两者都是O(n),其中n是像素数)。做一些基准测试,看看它是否能带来不同。使用qRgb()直接获取qRgb值,而不创建那些临时的QColor实例。据我所知,
QImage
有一些限制。也就是说,无法加载大于32000x32000像素的图像。我不知道你的应用程序将处理什么类型的图像。它们是真的,还是你的问题只是理论性的?谢谢你的回答!这个问题在理论/实践的范围内。也就是说:方法本身不能添加限制(除了规定的:内存或
QImage
specific)。从注释中,我推断两种方法都是相同的,即使第一种方法使用两个嵌套循环。假设扫描线在任何方面都不昂贵,我看不出这会有什么显著的区别,因为操作总数大致相同。