2012-01-21 261 views
1

我有一系列包含1個主要顏色的圖標。例如,我有一顆黃色的星星,具有反鋸齒的透明背景。更改圖像的顏色

有沒有辦法改變色調或飽和度來改變圖像爲紫色?

我使用C#4.0,我不在乎解決方案是GDI +還是WPF。我一直在使用System.Drawing.Image來讀取文件,但我不一定需要繼續這樣做。圖像相對較小,小於100x100,我希望顏色是動態的,所以只需編輯圖像本身來製作一堆副本並不是真正的解決方案。

有ColorMatrix類,但我不確定如何使用它從一種顏色轉換爲另一種顏色。使rgb值不同,看起來相當容易,但我怎麼能在顏色之間轉換?

+0

@ DanielA.White:我對setPixel一起砍死()方法現在的工作,但它的時間太長。 – Mark

回答

2

點擊此鏈接獲取有關C#中圖像處理的驚人指南。如果您瀏覽提交的用戶,則可以查找指南的全部6個部分。

http://www.codeproject.com/Articles/1989/Image-Processing-for-Dummies-with-C-and-GDI-Part-1

該指南介紹瞭如何使用不安全的代碼訪問圖像數據。我寧願保持代碼安全,並使用另一種方法如下:

 Bitmap b = new Bitmap(img1); 
     BitmapData bitmapData = b.LockBits(
      new Rectangle(0, 0, b.Width, b.Height), 
      ImageLockMode.ReadWrite, 
      PixelFormat.Format24bppRgb 
     ); 

     int numPixels = b.Width * b.Height; 
     byte[] pixels = new byte[numPixels * 3]; // 3 bytes per pixel 

     Marshal.Copy(bitmapData.Scan0, pixels, 0, pixels.Length); 

     // Use this method to apply an effect to each pixel individually 
     for (int i = 0; i < pixels.Length; i++) 
     { 
      byte value = pixels[i]; 
      // modify value 
      pixels[i] = value; 
     } 

     // Use this method to apply an effect that considers RGB relationship 
     byte red, green, blue; 

     for (int i = 0; i < pixels.Length; i += 3) 
     { 
      blue = pixels[i]; 
      green = pixels[i + 1]; 
      red = pixels[i + 2]; 

      // modify values 

      pixels[i] = blue; 
      pixels[i + 1] = green; 
      pixels[i + 2] = red; 
     } 

     Marshal.Copy(pixels, 0, bitmapData.Scan0, pixels.Length); 

     b.UnlockBits(bitmapData); 

每個不同的圖像處理技術是不C#特定。通過對算法的基本瞭解,您應該可以將其應用於此代碼。

2

world map

我用這個代碼來改變所有的海洋和海洋顏色... 也許是有點長,但我認爲這將有助於你...

首先我得到的所有像素noktalar列表

List<Nokta> noktalar = new List<Nokta>(); 


Bitmap bm = new Bitmap(pictureBox1.Image); 
for (int i = 0; i < pictureBox1.Height; i++) 
{ 
    for (int j = 0; j < pictureBox1.Width; j++) 
    { 
      Color col = bm.GetPixel(j, i); 
      Nokta n = new Nokta(); 
      n.point.X = j; 
      n.point.Y = i; 
      n.renk = col; 
      noktalar.Add(n); 
    } 
} 

而且諾克塔類:

public class Nokta 
{ 
    public Point point; 
    public Color renk;   
} 


deniz=noktalar.FindAll(FindDeniz); 


private static bool FindDeniz(Nokta n) 
{ 
    if (n.renk.Name == "ff000080") 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

最後改變顏色......

public void changeDenizColor(Color c) 
{ 
    Bitmap bitmap = new Bitmap(pictureBox1.Image); 
    foreach (Nokta n in deniz) 
    { 
     n.renk = c; 
     bitmap.SetPixel(n.point.X, n.point.Y, c); 
     pictureBox1.Image = bitmap; 
    } 
}