【问题标题】:Shifting the hue of a QImage / QPixmap改变 QImage / QPixmap 的色调
【发布时间】:2012-04-13 17:28:35
【问题描述】:

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

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

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

【问题讨论】:

  • 最终,任何库中的任何函数都必须遍历每个像素并对其进行修改。除非您需要各种不同的图像处理功能,否则自己编写会更容易。使用色相/饱和度比添加 RGB 值要复杂一些;如果你自己写一些东西,我建议你看看 HSV 到 RGB 的转换:en.wikipedia.org/wiki/HSL_and_HSV#Converting_to_RGB
  • 这就是我害怕的。我现在正在考虑创建一个带有黑色阴影/次要细节的透明图像,然后将其叠加在所需的颜色上,因为我最多只需要约 5 种颜色。

标签: qt graphics qimage qpixmap


【解决方案1】:

可能的行动方案:

  1. 将图像加载为 QImage
  2. 执行QImage 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 ) 的表

【讨论】:

  • 或者更好:您从 Format_Indexed8 的 256 色图像开始,采用支持此功能的图像格式(例如 gif 或 png),然后将该图像放入您的 qrc
  • 这不是 IMO 一个好的解决方案,因为在大多数情况下,由于保真度的损失等原因,无法将图像更改为索引。
  • 您不需要转换 - 这会损坏图像!只需使用 QImage::pixelColor / setPixelColor.
  • QImage 是位图。您只是在更改像素格式,在这里,您不会“重新压缩”jpg 或 png 之类的东西。很确定您的解决方案会起作用,但速度很慢(请参阅有关 QImage::setPixelColor 昂贵的警告)
【解决方案2】:

很遗憾,您有几个选项,其中没有一个是内置的 Qt 解决方案。

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

My application 做了很多图像过滤,老实说,我对将过滤器移植到 OpenCL 后获得的性能提升感到震惊。

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

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

祝您的编码冒险好运!

【讨论】:

    【解决方案3】:

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

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


    另一种选择——在这种情况下——是使用QPainterCompositionMode

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-28
        • 1970-01-01
        • 2021-05-14
        • 1970-01-01
        • 2018-06-15
        • 1970-01-01
        • 2012-05-05
        • 1970-01-01
        相关资源
        最近更新 更多