2012-01-21 208 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; 
    } 
}