将图片框中的图像更改为棕褐色

时间:2013-10-23 12:49:20

标签: c# visual-studio-2010 picturebox

我有一个图片框,想要将图像颜色更改为棕褐色我知道到目前为止要做什么到将其设置为灰度然后过滤它但最后一部分是我的垮台可以有人帮我设置为棕褐色从我提供的评论中提出我应该做的事情非常感谢

1 个答案:

答案 0 :(得分:4)

您的代码可归结为:

    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 ,它表示如何转换颜色,然后将图像重新绘制为一个新的Bitmap,使用ColorMatrix通过ImageAttributes传递它:

    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文章中获得了棕褐色调值。