2012-03-30 46 views
3

我想這通常是更多的圖形處理問題,但我想在Qt(C++)中完成此操作。如果我有一張圖片 - 讓我們只是在透明背景上說一個淺灰色的圓圈,Qt中是否有內置的功能來將色調/飽和度轉換爲彩色?移動QImage/QPixmap的色調

我想我可以像素逐像素地修改rgb數學 - 將r添加到r,g和b,以獲得所需的顏色,但必須有比修改每個像素更好的方法。

Qt Docs中的任何內容都沒有涉及圖像處理,只是改變了alpha和顏色。我應該看看一個開源庫嗎(最終結果可能是一個獨立銷售的軟件)?如果是這樣,有什麼建議嗎?或者是否有隱藏在Qt文檔中的祕密功能,可以在不需要外部庫/瘋狂算法的情況下完成?

+1

最終任何庫中的任何函數都必須遍歷每個像素並對其進行修改。除非您需要各種不同的圖像處理功能,否則只需自己編寫它就會更容易。使用色相/飽和度比添加RGB值要複雜一點;如果你自己寫了一些東西,我建議你看看HSV到RGB的轉換:http://en.wikipedia。org/wiki/HSL_and_HSV#Converting_to_RGB – kappamaki 2012-03-30 02:41:14

+0

這就是我所害怕的。我現在正在考慮創建一個帶有陰影/次要細節的透明圖像,並將其覆蓋在所需的顏色/顏色上,因爲我只需要〜5種顏色。 – giraffee 2012-03-30 03:10:21

回答

4

可能的行動路線:

  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)
+0

或更好:你開始一個支持這種格式(例如gif或png)的圖像格式的256色圖像Format_Indexed8,並將該圖像放入你的qrc中 – hmuelner 2012-03-30 09:46:50

+0

這不是一個好的解決方案,因爲在大多數情況下,將圖像更改爲由於失真等原因,索引不是一個選項。 – 2016-01-02 15:07:46

2

不幸的是,您有幾個選項,其中沒有一個是內置的Qt解決方案。

  1. 使用OpenMP或其他併發庫來利用 SSE/SSE2。
  2. 通過OpenGL,DirectX或各種GPGPU編程技術使用GPU。
  3. (我選擇的解決方案)使用OpenCL以充分利用CPU和GPU的協作性,而沒有渲染器編程的所有「樂趣」。
  4. 生成一個線程工作者池,讓他們每個人處理一個圖像的塊。

My application做了很多圖像過濾,我真的很震驚在將過濾器移植到OpenCL後的性能增益。

在1936×2592處,亮度修改過濾器在175ms內以原生C++代碼的形式在QImage中迭代每個像素。

移植到OpenCL後,降至15ms。當然,必須將數據從QImage中取出並重新插入,但與OpenCL性能增益相比,這些開銷並不是什麼大事。

祝您編碼冒險成功!