更改图像的颜色

时间:2012-01-21 01:31:16

标签: c# c#-4.0

我有一系列包含1种原色的图标。例如,我有一颗黄色的星星,透明的背景是消除锯齿的。

有没有办法改变色调或饱和度来改变图像为紫色?

我正在使用C#4.0,我不在乎解决方案是GDI +还是WPF。我一直在使用System.Drawing.Image来读取文件,但我不一定需要继续这样做。图像相对较小,小于100x100,我希望颜色是动态的,所以只是编辑图像本身来制作一堆副本并不是真正的解决方案。

有ColorMatrix类,但我不确定如何使用它将一种颜色转换为另一种颜色。只是让rgb值不同看起来相当容易,但我怎样才能在颜色之间进行转换?

2 个答案:

答案 0 :(得分: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#特定的。通过对算法的基本了解,您应该能够将其应用于此代码。

答案 1 :(得分:2)

world map

我用这段代码改变了所有的海洋和海洋颜色...... 也许它有点长,但我认为这会对你有所帮助......

首先,我获得noktalar List中的所有像素

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);
     }
}

和Nokta班:

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;
     }
}