当前位置:  编程技术>.net/c#/asp.net

c#数字图像处理的3种方法示例分享

    来源: 互联网  发布时间:2014-10-28

    本文导语:  本文主要通过彩色图象灰度化来介绍C#处理数字图像的3种方法,Bitmap类、BitmapData类和Graphics类是C#处理图像的的3个重要的类。 Bitmap只要用于处理由像素数据定义的图像的对象,主要方法和属性如下: GetPixel方法和SetPixel方法,...

本文主要通过彩色图象灰度化来介绍C#处理数字图像的3种方法,Bitmap类、BitmapData类和Graphics类是C#处理图像的的3个重要的类。

Bitmap只要用于处理由像素数据定义的图像的对象,主要方法和属性如下:

GetPixel方法和SetPixel方法,获取和设置一个图像的指定像素的颜色。

PixelFormat属性,返回图像的像素格式。

Palette属性,获取或折纸图像所使用的颜色调色板。

Height属性和Width属性,返回图像的高度和宽度。

LockBits方法和UnlockBits方法,分别锁定和解锁系统内存中的位图像素。

BitmapData对象指定了位图的属性:

Height属性,被锁定位图的高度。

Width属性,被锁定位图的宽度。

PixelFormat属性,数据的实际像素格式。

Scan0属性,被锁定数组的首字节地址。

Stride属性,步幅,也称扫描宽度。

彩色图象灰度化

24位彩色图象每个像素用3个字节表示,每个字节对应着R、G、B分量的亮度(红、绿、蓝)。当3个分量不想同时表现为灰度图像。下面有三种转换公式:

Gray(I,j)为转换后的灰度图像在(I,j)点出的灰度值。由于人眼对颜色的感应不同,有了下面的转换公式:

观察发现绿色所占比重最大,所以转换时直接使用G值作为转换结果:

图像处理的3种方法分别是:提取像素法、内存法和指针法,它们各自有各自的特点。

提取像素法

使用的是GDI+中的Bitmap.GetPixel和Bitmap.SetPixel方法。

代码如下:

if (bitmap != null)
{
    newbitmap = bitmap.Clone() as Bitmap;
    Color pixel;
    int ret;
    for (int x = 0; x < newbitmap.Width; x++)
    {
        for (int y = 0; y < newbitmap.Height; y++)
        {
            pixel = newbitmap.GetPixel(x, y);
            ret = (int)(pixel.R * 0.299 + pixel.G * 0.587 + pixel.B * 0.114);
            newbitmap.SetPixel(x, y, Color.FromArgb(ret, ret, ret));
        }
    }
    pictureBox1.Image = newbitmap.Clone() as Image;
}

内存法

内存法是把图像数据直接复制到内存中,这样程序的运行速度就能大大提高了。

代码如下:

if (bitmap != null)
{
    newbitmap = bitmap.Clone() as Bitmap;
    Rectangle rect = new Rectangle(0, 0, newbitmap.Width, newbitmap.Height);
    System.Drawing.Imaging.BitmapData bmpdata = newbitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, newbitmap.PixelFormat);
    IntPtr ptr = bmpdata.Scan0;

    int bytes = newbitmap.Width * newbitmap.Height * 3;
    byte[] rgbvalues = new byte[bytes];

    System.Runtime.InteropServices.Marshal.Copy(ptr, rgbvalues, 0, bytes);

    double colortemp = 0;
    for (int i = 0; i < rgbvalues.Length; i += 3)
    {
        colortemp = rgbvalues[i + 2] * 0.299 + rgbvalues[i + 1] * 0.587 + rgbvalues[i] * 0.114;
        rgbvalues[i] = rgbvalues[i + 1] = rgbvalues[i + 2] = (byte)colortemp;
    }

    System.Runtime.InteropServices.Marshal.Copy(rgbvalues, 0, ptr, bytes);

    newbitmap.UnlockBits(bmpdata);
    pictureBox1.Image = newbitmap.Clone() as Image;
}

指针法

这个方法和内存法相似,开始都是通过LockBits方法来获取位图的首地址,这个方法更简洁,直接用指针进行位图操作。所以对内存的操作需要在unsafe下进行操作。

代码如下:

if (bitmap != null)
{
    newbitmap = bitmap.Clone() as Bitmap;
    Rectangle rect = new Rectangle(0, 0, newbitmap.Width, newbitmap.Height);
    System.Drawing.Imaging.BitmapData bmpdata = newbitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, newbitmap.PixelFormat);
    byte temp;

    unsafe
    {
        byte* ptr = (byte*)(bmpdata.Scan0);

        for (int x = 0; x < bmpdata.Width; x++)
        {
            for (int y = 0; y < bmpdata.Height; y++)
            {
                temp = (byte)(0.299 * ptr[2] + 0.587 * ptr[1] + 0.114 * ptr[0]);
                ptr[0] = ptr[1] = ptr[2] = temp;
                ptr += 3;
            }
            ptr += bmpdata.Stride - bmpdata.Width * 3;
        }
    }

    newbitmap.UnlockBits(bmpdata);
    pictureBox1.Image = newbitmap.Clone() as Image;
}

    
 
 

您可能感兴趣的文章:

  • c#判断输入内容是否数字的代码
  • c#实现TextBox只允许输入数字
  • C# 验证码一例(随机数字加字母)
  • C#实现将千分位字符串转换成数字的方法
  • c#判断输入的是不是数字的小例子
  • C# 正则判断一个数字的格式是否有逗号的代码
  • C#实现在两个数字之间生成随机数的方法
  • c#中判断字符串是不是数字或字母的方法
  • C# WinForm窗体编程中处理数字的正确操作方法
  • C#实现根据数字序号输出星期几的简单实例
  • C# 大数字运算的小例子
  • C# 判断字符串第一位是否为数字或中文的代码
  • C# 判断字符串第一位是否为数字
  • C# 判断是否为数字的方法二则
  • C#实现大数字运算的实例代码
  • C# 实现只能输入数字的文本框
  • c# 正则表达式 验证数字的方法
  • c# 数字转换中文字符的代码
  • C#把数字转换成大写金额的代码实例
  • c# 验证数字和日期的方法与实现代码
  • java数字图像处理基础使用imageio写图像文件示例
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • jquery禁止输入数字以外的字符的示例(纯数字验证码)
  • php生成csv显示完整阿拉伯数字(示例)
  • Jquery只能输入数字与小数点示例
  • java控制台输出数字金字塔示例分享
  • jquery教程限制文本框只能输入数字和小数点示例分享
  • java生成字母数字组合的随机数示例 java生成随机数
  • python实现猜数字游戏(无重复数字)示例分享
  • python list使用示例 list中找连续的数字
  • JQuery只允许输入数字(示例代码)
  • JQuery EasyUI 数字格式化处理示例
  • python使用递归解决全排列数字示例
  • 用jsp页面生成随机的验证数字码示例
  • python3.3使用tkinter开发猜数字游戏示例
  • asp.net数字、字符相混合的验证码示例
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 数字签名,数字签名,数字签名!!
  • java实现判断字符串是否全是数字的四种方法代码举例
  • asp正则表达式匹配数字$数字$数字$
  • 高手请赐招:数字签名与数字认证的区别,尤其是概念上的区别。谢谢!
  • 请问linux用户名能否用数字?怎么才能用数字开头呢?
  • 请教:Java 中数字字符串转化为数字的问题
  • awk的数字运算中,数字变量的值的范围多少?
  • 对applet坐数字签名后,如果重新用jar对applet打包,需要重新做applet数字签名吗?
  • 请问,用c如何将一串数字字符转换成数字
  • 只能是字母或数字或者是字母和数字的组合的正则previousSibling
  • 请问Java中如何在控制台一行内输入n个数字,然后再在一行内输出这些数字
  • sql server 字段 全角数字转半角数字的代码分享
  • c语言中怎样从字母和数字组成的字符串中提取数字?
  • 如何让IE认识applet所带的数字签名,而不是让证书仓库认识这个带数字签名的applet,就是说不装jdk也可以在IE里面使用带有签名的applet,详情请进
  • php生成随机字符串(自定义纯数字、纯字母或数字字母混合)
  • 关于数字签名的几点疑问??另:csdn的数字签名帖子我都看过,不要介绍给我,我是诚心提问!!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3