C# 更改图像';s颜色
我有一系列包含一种原色的图标。例如,我有一个黄色的星,背景透明,抗锯齿 有没有办法改变色调或饱和度,将图像改为紫色 我使用的是C#4.0,我不在乎解决方案是GDI+还是WPF。我一直在使用System.Drawing.Image读取文件,但我不一定需要继续这样做。这些图像相对较小,小于100x100,我希望颜色是动态的,因此仅编辑图像本身以制作一组副本并不是一个真正的解决方案C# 更改图像';s颜色,c#,c#-4.0,C#,C# 4.0,我有一系列包含一种原色的图标。例如,我有一个黄色的星,背景透明,抗锯齿 有没有办法改变色调或饱和度,将图像改为紫色 我使用的是C#4.0,我不在乎解决方案是GDI+还是WPF。我一直在使用System.Drawing.Image读取文件,但我不一定需要继续这样做。这些图像相对较小,小于100x100,我希望颜色是动态的,因此仅编辑图像本身以制作一组副本并不是一个真正的解决方案 有ColorMatrix类,但我不确定如何使用它从一种颜色转换为另一种颜色。仅仅使rgb值不同看起来相当容易,但如何在颜
有ColorMatrix类,但我不确定如何使用它从一种颜色转换为另一种颜色。仅仅使rgb值不同看起来相当容易,但如何在颜色之间进行转换?请点击此链接,以获得有关C#图像处理的精彩指南。如果您浏览提交该指南的用户,您可以找到该指南的全部6个部分 本指南介绍如何使用不安全代码访问图像数据。我更喜欢保持代码的安全性,并使用以下替代方法:
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);
Bitmap b=新位图(img1);
BitmapData BitmapData=b.LockBits(
新矩形(0,0,b.宽度,b.高度),
ImageLockMode.ReadWrite,
PixelFormat.Format24bppRgb
);
整数像素=b.宽度*b.高度;
字节[]像素=新字节[numPixels*3];//每像素3字节
复制(bitmapData.Scan0,像素,0,像素,长度);
//使用此方法可分别对每个像素应用效果
对于(int i=0;i
每种不同的图像处理技术都不是C#特有的。对算法有了基本的了解后,您应该能够将其应用于此代码。通过此链接可以获得有关C#中图像处理的精彩指南。如果您浏览提交该指南的用户,您可以找到该指南的全部6个部分 本指南介绍如何使用不安全代码访问图像数据。我更喜欢保持代码的安全性,并使用以下替代方法:
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);
Bitmap b=新位图(img1);
BitmapData BitmapData=b.LockBits(
新矩形(0,0,b.宽度,b.高度),
ImageLockMode.ReadWrite,
PixelFormat.Format24bppRgb
);
整数像素=b.宽度*b.高度;
字节[]像素=新字节[numPixels*3];//每像素3字节
复制(bitmapData.Scan0,像素,0,像素,长度);
//使用此方法可分别对每个像素应用效果
对于(int i=0;i
每种不同的图像处理技术都不是C#特有的。对算法有了基本的了解,您应该能够将其应用于此代码。
我用这个代码来改变所有的海洋和海洋的颜色。。。
也许时间会长一点,但我想这会帮助你
首先,我得到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 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;
}
}
我用这个代码来改变所有的海洋和海洋的颜色。。。
也许时间会长一点,但我想这会帮助你
首先,我得到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 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;
}
}
@DanielA.White:我现在已经把setPixel()方法拼凑起来了,但是太长了。@DanielA.White:我现在把setPixel()方法拼凑起来了,但是太长了。