2014-01-13 71 views
1

我有一個困境。乍一看我的任務很簡單,但我肯定有一些麻煩。我有一個形象。灰色的圖像。我需要獲得彩色圖像。圖片顯示效果最好。改變灰色圖像C顏色的最好方法#

我知道兩種方法可以做到這一點: 1)改變色調, 2)改變色相(旋轉色矩陣)

色調改變共同的顏色和黑色的同時。所以我相信這種方式不適合我的情況。

色調變化需要基礎圖像已經着色,但所有圖像最初都是灰色的(帶漸變)。但它可以根據需要正常工作。

所以我對解決這個任務的方式有點困惑。

可能還有其他方法可以做我需要做的事嗎?

我非常感謝你的幫助,夥計們! 預先感謝您!

↑這是一個基本圖像↑ this is a base image

↑類似的是需要↑ this is needed to be achieved

tinted image

+0

不明確。這些黃色圖片是否可以或有問題?如果有錯誤,那麼使用的是什麼代碼? –

+0

你想擺脫RGB中的藍色部分? – Ralf

+0

爲了實現*類似*(第二幅圖像),您需要做有色圖像(第三,幾乎可以,也許嘗試不同的顏色?)和「添加」它掩蓋第一個圖像(刪除與黑色不同的一切圖像並且只在着色的圖像上放置這些黑色像素),以具有黑色正方形和黑色輪廓。 – Sinatr

回答

0

我寫了這兩種方法來完成這項工作了。您可以設置任何想要將圖像與其混合的顏色。

private void ApplyColor(Bitmap bm, Color userColor) 
    { 
     if (bm==null) 
      return; 

     // pixels loop 
     for (int i = 0; i < bm.Width; i++) 
     { 
      for (int j = 0; j < bm.Height; j++) 
      { 
       // get current pixel 
       Color curPix = bm.GetPixel(i, j); 
       Color curPixColor = Color.FromArgb(curPix.A, curPix.R, curPix.G, curPix.B); 

       // get result color by blending 
       Color resultColor = Blend(curPixColor, userColor, ColorMixFactor); 

       // set pixel color 
       bm.SetPixel(i, j, resultColor); 
      } 
     } 
    } 

    public static Color Blend(Color srcColor, Color dstColor, double amount) 
    { 
     // restrict black (dark) color from being affected by the blending 
     var br = srcColor.GetBrightness(); 
     if (br < BrightnessToAvoid) 
      return srcColor; 

     // get all 4 color channels 
     var r = (byte) ((srcColor.R*amount) + dstColor.R*(1 - amount)); 
     var g = (byte) ((srcColor.G*amount) + dstColor.G*(1 - amount)); 
     var b = (byte) ((srcColor.B*amount) + dstColor.B*(1 - amount)); 
     var a = srcColor.A; 

     // get blended color 
     return Color.FromArgb(a, r, g, b); 
    } 
+0

有一些性能問題這個代碼與GetPixel和SetPixel方法相關聯,可以用我在drankin2112的帖子中的一條評論中提到的方法解決。 – yurart

1

我已經寫一些代碼來傳遞的灰度來實現↑着色圖像分量爲黃色(在R和G分量之間共享),我已經得到足夠接近的結果,所需要做的就是使用R和G分量比率來獲得y的程度你需要的顏色。您還需要搜索更多關於如何處理對象底部的陰影。

// Load image 
Bitmap bm = new Bitmap("D:\\a.png"); 

for (int i = 0; i < bm.Width; i++) 
{ 
    for (int j = 0; j < bm.Height; j++) 
    { 
     // Handles transparent pixles 
     if (bm.GetPixel(i, j).R == 0 & bm.GetPixel(i, j).G == 0 & bm.GetPixel(i, j).B == 0 & bm.GetPixel(i, j).A == 0) bm.SetPixel(i, j, Color.Transparent); 
     // Passes the grey component of the grescale image to R and G compenents and changes pixle color 
     else bm.SetPixel(i, j, Color.FromArgb(bm.GetPixel(i, j).R, bm.GetPixel(i, j).R, 0)); 
    } 
} 

// Save image 
bm.Save("D:\\b.png"); 

下面是結果我從投稿的圖像

enter image description here

+0

您在FromArgb中使用了兩次紅色。大概你想採取和紅色和綠色。 – Ralf

+0

我花了兩次R(舊圖像中的灰色),並將其中的每一個傳遞給新的R和G(這兩個組件都是黃色的形式) – Sisyphus

+0

我在其他答案中添加了一個解決方案 – yurart