GDI+入门(十三、GDI+实例——灰度效果)

十三、GDI+实例——灰度效果

图片灰度化处理的方法主要有三种:

最大化法。这种方法的原理是使RGB的值等于值,即:

R=G=Bmax(RGB)

使用最大化法处理后的灰度图像的亮度很高。

平均值法。这种方法的原理是使RGB的恒等于三个色彩分量的平均值,即

R=G=B(R+G+B)/3

使用平均值法处理后的灰度图像亮度较为柔和。

加权平均值法。  “加权”是统计学中常用的名词,这种方法是根据重要性或其他

指标给RGD赋于不同的权值,并位RGB等于它们的加权平均值。即:

R=G=B=(rR+gG+bB))/3rgb分别是RGB的权值*权数rgb取不同的值时,加权平均值法能够形成不同灰度的灰度图像。由于人眼对绿色的敏感度最高,红色次之,对蓝色的敏感度最低,因此,当权值矿的时,所生成的灰度图像更符合人眼的视觉感受。通常,当r=30%,g=59%,b11%时,这种图像的灰度较为合理。

  private static Bitmap bitmap;

        private int width;

        private int height;

        public Form1()

        {

            InitializeComponent();

            bitmap = new Bitmap(Application.StartupPath + "//1.jpg");

            width = bitmap.Width - 1;

            height = bitmap.Height - 1;

        }

        Bitmap bmp2;

        Bitmap bmp3;

        Bitmap bmp4;

        private void button1_Click(object sender, EventArgs e)

        {

            Graphics panel2G = panel2.CreateGraphics();

            bmp2 = new Bitmap(width, height);

            Color color;

            for (int i = 0; i < width; i++)

            {

                for (int j = 0; j < height; j++)

                {

                    color = bitmap.GetPixel(i, j);

                    int middle = (color.R + color.G + color.B) / 3;

                    Color colorResult = Color.FromArgb(255, middle, middle, middle);

                    bmp2.SetPixel(i, j, colorResult);

                }

            }

            panel2G.DrawImage(bmp2, panel2.ClientRectangle);

            panel2G.ResetTransform();

            panel2G.TranslateTransform(width, 0);

           // bmp2.Dispose();

            panel2G.Dispose();

        }

 

        private void panel1_Paint(object sender, PaintEventArgs e)

        {

            Graphics panel1G = panel1.CreateGraphics();

            panel1G.DrawImage(bitmap, panel1.ClientRectangle);

            panel1G.Dispose();

        }

        private void ReDrawImage(Bitmap bmp0)

        {

            Color color;

            for (int i = width - 1; i >= 0; i--)

            {

                for (int j = height - 1; j >= 0; j--)

                {

                    color = bmp0.GetPixel(i, j);

                    int r = color.R;

                    int g = color.G;

                    int b = color.B;

                    //还原红色

                    if (r < 127)

                        r = 0;

                    if (r >= 192)

                        r = 255;

                    if (r <= 191 && r >= 128)

                        r = 4 * r - 510;

                    //还原绿色

                    bool yes;

                    yes = false;

                    if (g <= 191 && g >= 128 && (!yes))

                    {

                        g = 255;

                        yes = true;

                    }

                    if (g >= 192 && (!yes))

                    {

                        g = 1022 - 4 * g;

                        yes = true;

                    }

                    if (g <= 63 && (!yes))

                    {

                        g = 254 - 4 * g;

                        yes = true;

                    }

                    if (g <= 127 && g >= 67 && (!yes))

                    {

                        g = 4 * g - 257;

                    }

                    //还原蓝色分量

                    if (b <= 63)

                        b = 255;

                    if (b >= 128)

                        b = 0;

                    if (b >= 67 && b <= 127)

                        b = 510 - 4 * b;

                    Color colorResult = Color.FromArgb(255, r, g, b);

                    bmp0.SetPixel(i, j, colorResult);

                }

            }

            Graphics panel3G = panel3.CreateGraphics();

            panel3G.DrawImage(bmp0, panel3.ClientRectangle);

            bmp0.Dispose();

            panel3G.Dispose();

        }

        /// <summary>

        /// 最大值

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void button3_Click(object sender, EventArgs e)

        {

            Graphics panel2G = panel2.CreateGraphics();           

            bmp3 = new Bitmap(width, height);

            Color color;

            for (int i = 0; i < width; i++)

            {

                for (int j = 0; j < height; j++)

                {

                    color = bitmap.GetPixel(i, j);

                    int middle = maxColor(color.R, color.G, color.B);

                    Color colorResult = Color.FromArgb(255, middle, middle, middle);

                    bmp3.SetPixel(i, j, colorResult);

                }

            }

            panel2G.DrawImage(bmp3, panel2.ClientRectangle);

         //   bmp3.Dispose();

            panel2G.Dispose();

        }

 

        /// <summary>

        /// 加权平均

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void button4_Click(object sender, EventArgs e)

        {

            double r = 0.30;

            double g = 0.59;

            double b = 0.11;

            bmp4 = new Bitmap(width, height);

 

            Graphics panel2G = panel2.CreateGraphics();

            Color color;

            for (int i = 0; i < width; i++)

            {

                for (int j = 0; j < height; j++)

                {

                    color = bitmap.GetPixel(i, j);

                    // int middle =(int) ( + g * color.G + b * color.B) / 3;

                    Color colorResult = Color.FromArgb(255, (int)(r * color.R), (int)(g * color.G), (int)(b * color.B));

                    bmp4.SetPixel(i, j, colorResult);

                }

            }

            panel2G.DrawImage(bmp4, panel2.ClientRectangle);

           // bmp4.Dispose();

            panel2G.Dispose();

        }

 

        private int maxColor(int r, int g, int b)

        {

            if (r > g)

            {

                if (r > b)

                {

                    return r;

                }

                else

                {

                    return b;

                }

            }

            else

            {

                if (g > b)

                {

                    return g;

                }

                else

                {

                    return b;

                }

            }

        }

         private void button2_Click(object sender, EventArgs e)

        {

            if (bmp3 == null)

            {

                MessageBox.Show("请先点击变灰按钮");

                return;

            }

            ReDrawImage(bmp3.Clone(new Rectangle(0,0,width,height),PixelFormat.DontCare));

        }

        private void button2_Click_1(object sender, EventArgs e)

        {

            if (bmp2 == null)

            {

                MessageBox.Show("请先点击变灰按钮");

                return;

            }

            ReDrawImage(bmp2.Clone(new Rectangle(0,0,width,height),PixelFormat.DontCare));

        }

 

        private void button6_Click(object sender, EventArgs e)

        {

            if (bmp4 == null)

            {

                MessageBox.Show("请先点击变灰按钮");

                return;

            }

            ReDrawImage(bmp4.Clone(new Rectangle(0,0,width,height),PixelFormat.DontCare));

        }

button1_Click:平均值法

panel1_Paint:加载原图

ReDrawImage:灰色图像还原彩色图像

button3_Click:最大值法制作灰度图像

button4_Click:加权平均法制作灰度图像

maxColor:求颜色分量最大值

平均值方法:

最大值法:

加权平均法

本人也在学习GDI+,写得比较简单,让高手见笑了。欢迎高手给我指点

邮箱:bobui@163.com

QQ125941562

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值