我有一系列包含1种原色的图标。例如,我有一颗黄色的星星,透明的背景是消除锯齿的。
有没有办法改变色调或饱和度来改变图像为紫色?
我正在使用C#4.0,我不在乎解决方案是GDI +还是WPF。我一直在使用System.Drawing.Image来读取文件,但我不一定需要继续这样做。图像相对较小,小于100x100,我希望颜色是动态的,所以只是编辑图像本身来制作一堆副本并不是真正的解决方案。
有ColorMatrix类,但我不确定如何使用它将一种颜色转换为另一种颜色。只是让rgb值不同看起来相当容易,但我怎样才能在颜色之间进行转换?
答案 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)
我用这段代码改变了所有的海洋和海洋颜色...... 也许它有点长,但我认为这会对你有所帮助......
首先,我获得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;
}
}