改变QImage / QPixmap的色调

5
我想这更多是关于图形处理的问题,但我想在Qt(c++)中完成。如果我有一张图像——比如一个圆在透明背景上——颜色是浅灰色的,那么Qt中是否有内置功能来移动色调/饱和度以改变其颜色?
我觉得我可以逐像素进行修改rgb数学计算——将x添加到r、g和b,以获得所需的颜色,但一定有比修改每个像素更好的方法。
Qt文档中没有这么深入地涉及图像处理,只有改变Alpha和颜色。我应该研究一下开源库(最终结果可能是独立销售的软件)吗?如果是,有什么建议吗?或者在Qt文档中有没有隐藏的秘密函数可以在不需要外部库/疯狂算法的情况下实现?

1
最终,任何库中的任何函数都必须循环遍历每个像素并修改它。除非您需要各种不同的图像操作函数,否则编写自己的函数会更容易。与色相/饱和度一起工作比添加到RGB值稍微复杂一些;如果您确实要自己编写某些内容,建议您查看HSV到RGB转换:http://en.wikipedia.org/wiki/HSL_and_HSV#Converting_to_RGB - kappamaki
这正是我担心的。我现在考虑只创建一个带有黑色阴影/细节的透明图像,并将其叠加在所需的颜色/颜色上,因为我只需要最多 ~5种颜色。 - dajaffe
4个回答

6

一个可能的操作步骤:

  1. 将您的图像作为QImage加载
  2. 使用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)更改颜色表

请注意,保留了HTML标签。

你可以从一个支持256色的图像格式(例如gif或png)中选择一个Format_Indexed - hmuelner
这不是一个好的解决方案,因为在大多数情况下,由于保真度等原因,将图像更改为索引不是一个选项。 - Mr. Developerdude
不需要转换 - 这会损坏图像!只需使用 QImage::pixelColor / setPixelColor。 - Alexander Dyagilev
QImage是一种位图。在这里,您只是更改像素格式,而不是“重新压缩”像jpg或png这样的东西。我相信您的解决方案会起作用,但速度会非常慢(请参见有关QImage :: setPixelColor昂贵的警告)。 - Chris Browet

2

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

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

我的应用程序执行大量图像过滤,当我将过滤器移植到OpenCL后,我对性能提升感到非常惊讶。

在1936×2592下,亮度修改过滤器在原生的C++代码中迭代QImage中的每个像素需要175ms。

转换为OpenCL后,时间降至15ms。当然,数据必须从QImage中提取出来并重新插入,但与OpenCL性能增益相比,这种开销微不足道。

祝你在编码冒险中好运!


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

0
在这种情况下,您似乎可以使用QGraphicsColorizeEffect来解决问题。
与改变色调不同,这种方法将设置它。尽管似乎只能将QGraphicsEffect应用于QWidgetQGraphicsItem,但这可能会带来不便。

另一种选项-在这种情况下-是使用QPainterCompositionMode


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接