我有一个图片框,想要将图像颜色更改为棕褐色,我知道到目前为止该怎么做,将其设置为灰度然后过滤它,但最后一部分是我的失败,有人可以通过建议我为我将其设置为棕褐色应该从我提供的评论中做很多
最佳答案
您的代码可以归结为:
private void button1_Click(object sender, EventArgs e)
{
Bitmap sepiaEffect = (Bitmap)pictureBox.Image.Clone();
for (int yCoordinate = 0; yCoordinate < sepiaEffect.Height; yCoordinate++)
{
for (int xCoordinate = 0; xCoordinate < sepiaEffect.Width; xCoordinate++)
{
Color color = sepiaEffect.GetPixel(xCoordinate, yCoordinate);
double grayColor = ((double)(color.R + color.G + color.B)) / 3.0d;
Color sepia = Color.FromArgb((byte)grayColor, (byte)(grayColor * 0.95), (byte)(grayColor * 0.82));
sepiaEffect.SetPixel(xCoordinate, yCoordinate, sepia);
}
}
pictureBox.Image = sepiaEffect;
}
但是,这是一组非常慢的嵌套循环。一种更快的方法是创建一个ColorMatrix来表示如何变换颜色,然后使用ColorMatrix通过ImageAttributes将图像重绘到新的Bitmap中:
private void button2_Click(object sender, EventArgs e)
{
float[][] sepiaValues = {
new float[]{.393f, .349f, .272f, 0, 0},
new float[]{.769f, .686f, .534f, 0, 0},
new float[]{.189f, .168f, .131f, 0, 0},
new float[]{0, 0, 0, 1, 0},
new float[]{0, 0, 0, 0, 1}};
System.Drawing.Imaging.ColorMatrix sepiaMatrix = new System.Drawing.Imaging.ColorMatrix(sepiaValues);
System.Drawing.Imaging.ImageAttributes IA = new System.Drawing.Imaging.ImageAttributes();
IA.SetColorMatrix(sepiaMatrix);
Bitmap sepiaEffect = (Bitmap)pictureBox.Image.Clone();
using (Graphics G = Graphics.FromImage(sepiaEffect))
{
G.DrawImage(pictureBox.Image, new Rectangle(0, 0, sepiaEffect.Width, sepiaEffect.Height), 0, 0, sepiaEffect.Width, sepiaEffect.Height, GraphicsUnit.Pixel, IA);
}
pictureBox.Image = sepiaEffect;
}
我从this文章中获得了棕褐色调值。