5

我想这更像是一个图形处理问题,但我想在 Qt (c++) 中完成这个。如果我有一个浅灰色的图像 - 比如说透明背景上的一个圆圈 - Qt 中是否有任何内置功能可以改变色调/饱和度以对其进行着色?

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

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

4

4 回答 4

6

一个可能的行动方案:

  1. 将图像加载为 QImage
  2. 执行 aQImage QImage::convertToFormat(QImage::Format_Indexed8)以获取带有颜色表的索引图像
  3. 获取颜色表值QRgb QImage::color ( int i ) const
  4. QColor ( QRgb color )使用和其他 QColor 方法操作颜色
  5. 改变颜色表void QImage::setColor ( int index, QRgb colorValue )
于 2012-03-30T08:39:20.513 回答
2

你有几个选项,不幸的是,没有一个是内置的 Qt 解决方案。

  1. 使用 OpenMP 或其他一些并发库来利用 SSE/SSE2。
  2. 通过 OpenGL、DirectX 或各种 GPGPU 编程技术使用 GPU。
  3. (我选择的解决方案)使用OpenCL来利用 CPU 和 GPU 的并发性,而无需着色器编程的所有“乐趣”。
  4. 产生一个线程工作者池,让他们每个人处理一大块图像。

我的应用程序进行了大量的图像过滤,老实说,我对将过滤器移植到 OpenCL 后的性能提升感到震惊。

在 1936×2592 时,亮度修改滤镜在原生 C++ 代码中以 175 毫秒运行,遍历 QImage 中的每个像素。

移植到 OpenCL 后,下降到 15 毫秒。当然,必须从 QImage 中提取数据并重新插入,但与 OpenCL 性能提升相比,这种开销微不足道。

祝你的编码冒险好运!

于 2012-06-09T01:16:50.160 回答
0

在这种情况下,听起来您可以使用QGraphicsColorizeEffect侥幸逃脱。

这个方法不会改变色调,而是设置它。虽然看起来QGraphicsEffects 只能应用于QWidgets 和QGraphicsItems,这可能很不方便。


另一种选择——在这种情况下——是使用QPainter's CompositionMode

于 2020-10-23T16:56:54.037 回答
0

只需使用QImage::pixelColorand QImage::setPixelColor(自Qt5.6 起可用)。

于 2021-01-09T16:33:49.107 回答