更新图像显示时的QImage和openmp
QImage and openmp when updating image display
在 mac 的 Qt 5.5 中,我正在尝试使用 QImage 加速计算图像缓冲区及其显示。我正在使用 openMP 指令,但我意识到这会干扰 QImage 显示。
代码如下:
int = 65535
newPaintImage = new QImage(naxis1, naxis2, QImage::Format_ARGB32 );
#pragma omp parallel for
for ( int ii = 0; ii < nPixels; ++ii )
{
cred = (int) 255 * red16[ii] / range;
cgreen = (int) 255 * green16[ii] / range;
cblue = (int) 255 * blue16[ii] / range;
QRgb argb = qRgba( cred, cgreen, cblue, 255);
QRgb* rowData = (QRgb*) newPaintImage->scanLine(ii/naxis1);
rowData[ii%naxis1] = argb;
}
newPaintWidget = new PaintWidget(newPaintImage, naxis1, naxis2);
在上面的代码中,nPixels
是图像中的像素总数,red16
、green16
和blue16
是我的3个颜色通道图片。它们的大小等于 nPixels
。值 naxis1
和 naxis2
是宽度和高度(以像素为单位)。
注意用于并行化 for 循环的 pragma 指令。当我使用它时,我的图像中出现乱码,对图像的任何更新都会改变结果。
当我不使用 pragma 指令时,只使用一个线程,我的图像如预期的那样很好。
我用这种并行化改变和更新缓冲区,这会弄乱显示。
有没有更好的方法?就像确保我的线程完成工作然后更新 Qt 对象的 paintEvent 中的显示一样?或者与 QImage 如何在线程之间共享有关的东西?...
谢谢
感谢评论中的建议,我修复了它。需要 pragma 子句 private
来定义要使用的私有变量。
int cred2, cgreen2, cblue2
#pragma omp parallel for private(cred2, cgreen2, cblue2)
for ( int ii = 0; ii < nPixels; ++ii )
{
cred2 = (int) 255 * red16[ii] / range;
cgreen2 = (int) 255 * green16[ii] / range;
cblue2 = (int) 255 * blue16[ii] / range;
QRgb argb = qRgba( cred2, cgreen2, cblue2, 255);
QRgb* rowData = (QRgb*) newPaintImage->scanLine(ii/naxis1);
rowData[ii%naxis1] = argb;
}
newPaintWidget = new PaintWidget(newPaintImage, naxis1, naxis2);
是的,速度要快得多!这与执行对比度拉伸的一些 QSlider signal/slots 一起使用。我在这里简化了代码。事实上,range
正在变化而不是固定的,例如red16[ii]
是 (red16[ii] - minValue)
,其中 minValue
随某些 QSlider 的变化而变化。
在 mac 的 Qt 5.5 中,我正在尝试使用 QImage 加速计算图像缓冲区及其显示。我正在使用 openMP 指令,但我意识到这会干扰 QImage 显示。
代码如下:
int = 65535
newPaintImage = new QImage(naxis1, naxis2, QImage::Format_ARGB32 );
#pragma omp parallel for
for ( int ii = 0; ii < nPixels; ++ii )
{
cred = (int) 255 * red16[ii] / range;
cgreen = (int) 255 * green16[ii] / range;
cblue = (int) 255 * blue16[ii] / range;
QRgb argb = qRgba( cred, cgreen, cblue, 255);
QRgb* rowData = (QRgb*) newPaintImage->scanLine(ii/naxis1);
rowData[ii%naxis1] = argb;
}
newPaintWidget = new PaintWidget(newPaintImage, naxis1, naxis2);
在上面的代码中,nPixels
是图像中的像素总数,red16
、green16
和blue16
是我的3个颜色通道图片。它们的大小等于 nPixels
。值 naxis1
和 naxis2
是宽度和高度(以像素为单位)。
注意用于并行化 for 循环的 pragma 指令。当我使用它时,我的图像中出现乱码,对图像的任何更新都会改变结果。 当我不使用 pragma 指令时,只使用一个线程,我的图像如预期的那样很好。 我用这种并行化改变和更新缓冲区,这会弄乱显示。
有没有更好的方法?就像确保我的线程完成工作然后更新 Qt 对象的 paintEvent 中的显示一样?或者与 QImage 如何在线程之间共享有关的东西?...
谢谢
感谢评论中的建议,我修复了它。需要 pragma 子句 private
来定义要使用的私有变量。
int cred2, cgreen2, cblue2
#pragma omp parallel for private(cred2, cgreen2, cblue2)
for ( int ii = 0; ii < nPixels; ++ii )
{
cred2 = (int) 255 * red16[ii] / range;
cgreen2 = (int) 255 * green16[ii] / range;
cblue2 = (int) 255 * blue16[ii] / range;
QRgb argb = qRgba( cred2, cgreen2, cblue2, 255);
QRgb* rowData = (QRgb*) newPaintImage->scanLine(ii/naxis1);
rowData[ii%naxis1] = argb;
}
newPaintWidget = new PaintWidget(newPaintImage, naxis1, naxis2);
是的,速度要快得多!这与执行对比度拉伸的一些 QSlider signal/slots 一起使用。我在这里简化了代码。事实上,range
正在变化而不是固定的,例如red16[ii]
是 (red16[ii] - minValue)
,其中 minValue
随某些 QSlider 的变化而变化。