一、System.Drawing.Bitmap

Bitmap 类: 封装GDI+ 位图,此位图由图形图像及其属性的像素数据组成。Bitmap 是用于处理由像素定义的图像的对象

命名空间: System.Drawing

程序集:   System.Drawing.dll

继承关系:

原型定义:

[SerializableAttribute]
[ComVisibleAttribute(true)]
public sealed class Bitmap : Image

备注:
GDI+ 支持下列文件格式:BMP、GIF、EXIF、JPG、PNG 和 TIFF

构造器:

// 从指定的现有图像初始化 Bitmap 类的新实例
public Bitmap(Image original) // 从指定的数据流初始化 Bitmap 类的新实例
public Bitmap(Stream stream) // 从指定的文件初始化 Bitmap 类的新实例 (filename 位图文件的名称和路径)
public Bitmap(string filename)

注意:在 在释放 Bitmap 之前,此filename 对应的文件将一直保持锁定状态

常用实例方法:

. 获取指定像素的颜色
public Color GetPixel(int x,int y)
参数:
x : 指定像素的 x 坐标
y : 指定像素的 y 坐标
返回值:
System.Drawing.Color . 设置指定像素的颜色
public void SetPixel(int x,int y,Color color)
参数:
x : 指定像素的 x 坐标
y : 指定像素的 y 坐标
color: 颜色 . 将 Bitmap 锁定到系统内存中
[SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
public BitmapData LockBits(Rectangle rect,ImageLockMode flags,PixelFormat format)
参数:
rect: 指定要锁定 Bitmap 部分
flags: 指定 Bitmap 的访问级别(读/写)
format: 指定此 Bitmap 的数据格式
返回值:
BitmapData 包含有关此锁定操作的信息 . 从系统内存解锁此 Bitmap
UnlockBits(BitmapData) . 使默认的透明颜色对此 Bitmap 透明
MakeTransparent()
MakeTransparent(Color transparentColor)

透明化的例子

 using System;
using System.Drawing; class App
{
static void Main()
{
var img = new Bitmap(@"透明化.png");
img.MakeTransparent();
img.Save(@"透明化_处理后.png") ; // MakeTransparent(Color transparentColor) 对指定Color 也执行透明操作
img.MakeTransparent(Color.FromArgb(0x1364C4));
img.Save(@"透明化_处理后_0x1364C4.png");
}
}

附本小节代码下载

二、System.Drawing.Imaging.ImageLockMode

ImageLockMode 枚举:指定传递给 LockBits 方法的标志参数的标志。 LockBits 方法可锁定图像的一部分,以便读取或写入其像素数据

枚举项:

ReadOnly:   指定锁定图像的一部分以便读取

WriteOnly:  指定锁定图像的一部分以便写入

ReadWrite:  指定锁定图像的一部分以便读取和写入

三、System.Drawing.Imaging.PixelFormat

PixelFormat 枚举:指定图像中每个像素的颜色数据的格式

枚举项:见MSDN

四、System.Drawing.Imaging.BitmapData

BitmapData 类:指定位图图像的属性。BitmapData 类由 Bitmap 类的 LockBits 和 UnlockBits 方法使用。 不可继承

命名空间:   System.Drawing.Imaging

程序集:   System.Drawing.dll

继承关系:

实例属性:

Height           //获取或设置Bitmap 对象的像素高度,有时也称扫描行数
Width //获取或设置Bitmap 对象的像素宽度,这可以看做是一个扫描行中的像素数
PixelFormat: //获取或设置此 BitmapData对象的 Bitmap 对象中像素信息的格式
Scan0 //获取或设置位图中第一个像素数据的地址。它可看成是位图中的第一个扫描行
Stride //获取或设置 Bitmap 对象的跨距宽度(也称为扫描宽度)

五、System.Drawing.Color

Color 结构:表示一种 ARGB 颜色(alpha、红色、绿色、蓝色)。

命名空间: System.Drawing

程序集:   System.Drawing.dll

静态属性: 各种颜色(如 Color.Red、Color.Yellow 等)

静态方法:

Color.FromArgb(int argb)
例子:
SolidBrush trnsRedBrush = new SolidBrush(Color.FromArgb(0x78FF0000)); 从四个 ARGB 分量(alpha、红色、绿色和蓝色)值创建 Color 结构。 尽管此方法允许为每个分量传递 位值,但每个分量的值仅限于 位
// 78 FF 00 00
public static Color FromArgb(int alpha,int red,int green,int blue)

 六、例子 彩色图像简单灰度化

公式:

Gray(i,j) = 0.229*R(i,j) + 0.587*G(i,j) + 0.114*B(i,j)

代码

 using System;
using System.Drawing;
using System.Drawing.Imaging; class App
{
static void Main()
{
using(var img = new Bitmap(@"BingWallpaper.jpg"))
{
Rectangle rect = new Rectangle(, , img.Width, img.Height);
BitmapData bmpData = img.LockBits(rect,ImageLockMode.ReadWrite,img.PixelFormat);
IntPtr ptr = bmpData.Scan0;
int bytes = img.Width * img.Height * ;
byte[] rgbValues = new byte[bytes];
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, , bytes);
double colorTemp = ;
for (int i = ; i < rgbValues.Length; i += )
{
colorTemp = rgbValues[i + ] * 0.299 + rgbValues[i + ] * 0.587 + rgbValues[i] * 0.114;
rgbValues[i] = rgbValues[i + ] = rgbValues[i + ] = (byte)colorTemp;
}
System.Runtime.InteropServices.Marshal.Copy(rgbValues, , ptr, bytes);
img.UnlockBits(bmpData); img.Save(@"BingWallpaper_灰度化.jpg");
}
}
}

附本小节代码下载

效果

原图:

灰度化图:

2014-12-21 更新:

1. Format24bppRgb : 每个像素24位,红色、绿色、蓝色分量分别使用8位,它们的顺序是 蓝、率、红(BGR)

2. Stride 即步幅也称扫描宽度,系统规定它必须是4的倍数

3. BmpData.Width 与 BmpData.Stride 的关系 BmpData.Stride = BmpData.Width * 3 + X(X为保留字节,用来调节,使Stride 能被4整除)

下面两幅图说明 Height、 Width 与 Stride

Scan0

|
|---------Stride-----------------|
|---------Width-------------| |    注:Width是图片(BGR作为一个单位)宽度
BGR BGR BGR BGR BGR BGR XX
BGR BGR BGR BGR BGR BGR XX
.
.
注:BGR
为一个像素,是byte[3]的数组

下图来自《C#数字图像处理算法》一书

4. 代码修正

 六、例子 彩色图像简单灰度化 这节的代码有问题,因为我给的图片Width正好是4的倍数,所以 Width *3 也是4的倍数,所以不需要额外字节,但如果Width不是4的倍数,代码就不能得到正确的结果了,下面将修正后的代码贴出

 using System;
using System.Drawing;
using System.Drawing.Imaging; class App
{
static void Main()
{
using(var img = new Bitmap(@"test.png"))
{
Rectangle rect = new Rectangle(, , img.Width, img.Height);
BitmapData bmpData = img.LockBits(rect,ImageLockMode.ReadWrite,img.PixelFormat);
IntPtr ptr = bmpData.Scan0; // 用步幅表示
int bytes = bmpData.Stride * bmpData.Height;
byte[] rgbValues = new byte[bytes];
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, , bytes);
double colorTemp = ;
int bmpStride = bmpData.Stride; for(int bmpheight = ; bmpheight < bmpData.Height; bmpheight++)
{
// 只处理实际 Height , 不理会未用空间
for(int bmpwidth = ; bmpwidth < bmpData.Width *; bmpwidth += )
{
colorTemp = rgbValues[bmpheight * bmpStride + bmpwidth + ] * 0.299 +
rgbValues[bmpheight * bmpStride + bmpwidth + ] * 0.587 +
rgbValues[bmpheight * bmpStride + bmpwidth] * 0.114; rgbValues[bmpheight * bmpStride + bmpwidth] =
rgbValues[bmpheight * bmpStride + bmpwidth + ] =
rgbValues[bmpheight * bmpStride + bmpwidth + ] = (byte)colorTemp;
}
} System.Runtime.InteropServices.Marshal.Copy(rgbValues, , ptr, bytes);
img.UnlockBits(bmpData); img.Save(@"BingWallpaper_灰度化.jpg");
}
}
}

类库探源——System.Drawing.Bitmap的更多相关文章

  1. 类库探源——System.Drawing

    一.System.Drawing 命名空间简述 System.Drawing 命名空间提供访问 GDI+ 的基本功能,更高级的功能在 System.Drawing.Drawing2D,System.D ...

  2. 将System.Drawing.Bitmap转换为Direct2D.D2DBitmap

    最近在尝试Direct2D编程,挺好玩的. 但是有时候还是会用到GDI+来生成图片,但D2D绘图需要用到自己的D2DBitmap类. 因此需要转换,查阅了下网上的资料,写了这么一个方法: using ...

  3. 让System.Drawing.Bitmap可以在linux运行

    .net core的bitmap使用的是以下类库,但无法在linux运行 https://github.com/CoreCompat/CoreCompat 在linux运行需要安装runtime.li ...

  4. 类库探源——System.Delegate

    一.MSDN 描述 Delegate 类:表示委托,委托是一种数据结构,它引用静态方法或引用类实例及该类的实例方法.(是不是感觉很像C语言中的函数指针 :) ) 命名空间: System 程序集:   ...

  5. 类库探源——System.Configuration 配置信息处理

    按照MSDN描述 System.Configuration 命名空间 包含处理配置信息的类型 本篇文章主要两方面的内容 1. 如何使用ConfigurationManager 读取AppSetting ...

  6. 类库探源——System.Math 和 Random

    一.System.Math Math类:为三角函数.对数函数和其他通用数学函数提供常数和静态方法 命名空间: System 程序集 :   mscorlib.dll 继承关系: 常用属性: Math. ...

  7. 类库探源——System.ValueType

    一.MSDN描述 ValueType 类:提供值类型的基类 命名空间: System 程序集:   mscorlib.dll 继承关系: 值类型包括:字符.整数.浮点.布尔.枚举.结构(其实字符.整数 ...

  8. 类库探源——System.Environment

    Environment 类: 提供有关当前环境和平台的信息以及操作它们的方法.此类不能被继承. 命名空间: System 程序集:   mscorlib.dll 继承关系: 常用属性(字段)和方法: ...

  9. 类库探源——System.Exception

    一.MSDN描述 Exception 类: 表示在应用程序执行期间发生的错误 命名空间 : System 程序集:   mscorlib.dll 继承关系: 常用属性(含字段)和方法: 1. 属性Me ...

随机推荐

  1. ubuntu下git安装及连接github

    1.安装 sudo apt-get install git git-core git-gui git-doc git-svn git-cvs gitweb gitk git-email git-dae ...

  2. ZOJ-2362 Beloved Sons 贪心 | KM

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2362 裸的匹配问题,直接KM,就算是O(n^4)的KM也不会超. ...

  3. ZOJ-3720 Magnet Darts 计算几何,概率

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3720 题意:在一个矩形区域投掷飞镖,每个整点有磁性,每个点的磁性 ...

  4. java中的"goto"--label

    java中没有goto,但是goto是保留字.例如int goto;是不合法的. 但是java中有标签,仅作用在多重循环的continue和break中. continue和break只能作用于本层循 ...

  5. 成都Uber优步司机奖励政策(2月6日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  6. local storage 简单应用‘’记住密码’

    前些时候一直用cookie等来进行登录页面记住面膜操作,但是由于其存储容量小等缘故,所以后来转向local storage,原理为:当用户勾选记住密码时,local storage 存储用户名密码同时 ...

  7. 找出数组前N大的数

    这个题也是个比较有名的面试题.当然有很多变种. 题目意思基本是:从一个数据量很大的数组里找前N大的元素.不允许排序. 这个题有两个比较好的思路: 思路一:用快速排序的思想,是思想,不是要排序; 思路二 ...

  8. Java编程思想第四版*第七章*个人练习

    欢迎加群:239063848 成团的笔记:该组仅用于技术共享和交流,问题和答案公布 潘基聊天.禁止广告.禁止招聘-- 练习1:(2)创建一个简单的类.第二个类中,将一个引用定义为第一个类的对象.运用惰 ...

  9. MySQL DBA教程:Mysql性能优化之缓存参数优化

      在平时被问及最多的问题就是关于 MySQL 数据库性能优化方面的问题,所以最近打算写一个MySQL数据库性能优化方面的系列文章,希望对初中级 MySQL DBA 以及其他对 MySQL 性能优化感 ...

  10. 动作之CCActionInterval(持续动作)家族

    持续动作,顾名思义,就是该动作的执行将持续一段时间.因此持续动作的静态生成函数,往往附带一个时间值Duration. 持续动作类名后缀:一般有两种后缀,一种是To,一种是By.To表示最终达到的目标值 ...