转移QImage / QPixmap的色调

时间:2012-03-30 02:00:18

标签: qt graphics qimage qpixmap

我认为这通常是一个图形操作问题,但我想在Qt(c ++)中实现这一点。如果我有一个图像 - 让我们在透明背景上说一个圆圈 - 浅灰色,Qt中是否有任何内置功能可以将色调/饱和度转换为颜色?

我想我可以逐像素地进行,并以数学方式修改rgb - 将x添加到r,g和b,以获得所需的颜色,但必须有一种比修改每个像素更好的方法。

Qt Docs中的任何内容都没有进入图像处理,只是改变了alpha和颜色。我应该查看一个开源库(最终结果可能是一个独立销售的软件)?如果是的话,有什么建议吗?或者是否有一个隐藏在Qt文档中的秘密函数可以在不需要外部库/疯狂算法的情况下完成?

4 个答案:

答案 0 :(得分:6)

可能的行动方案:

  1. 将图片加载为QImage
  2. 执行QImage QImage::convertToFormat(QImage::Format_Indexed8)获取索引 带有颜色表的图像
  3. 使用QRgb QImage::color ( int i ) const
  4. 获取颜色表值
  5. 使用QColor ( QRgb color )和其他QColor方法操作颜色
  6. 改变颜色 表void QImage::setColor ( int index, QRgb colorValue )

答案 1 :(得分:2)

不幸的是,你有一些选择,其中没有一个是内置的Qt解决方案。

  1. 使用OpenMP或其他一些并发库来利用 SSE / SSE2。
  2. 通过OpenGL,DirectX或各种GPGPU编程技术使用GPU。
  3. (我选择的解决方案)使用OpenCL来充分利用CPU和GPU的完美性,而不需要着色器编程的所有“乐趣”。
  4. 产生一个线程工作者池,并让每个人处理一大块图像。
  5. My application进行了大量的图像过滤,我真的很震惊于将过滤器移植到OpenCL后的性能提升。

    在1936×2592处,亮度修改滤波器在本机C ++代码中以175ms运行,迭代QImage中的每个像素。

    移植到OpenCL后,降至15ms。当然,必须将数据从QImage中拉出并重新插入,但与OpenCL性能提升相比,这一开销无关紧要。

    祝你的编码冒险好运!

答案 2 :(得分:0)

在这种情况下,听起来您可能可以使用QGraphicsColorizeEffect

此方法将设置,而不是改变色调。尽管似乎QGraphicsEffect仅适用于QWidgetQGraphicsItem,这很不方便。


在这种情况下,另一种选择是使用QPainter的{​​{3}}。

答案 3 :(得分:0)

只需使用 QImage::pixelColorQImage::setPixelColor(自 Qt 5.6 起可用)。