吉吉于

C#每天抄一点(24):图像纹理和浮雕效果

一首来自Loveage的歌,那首禁曲想必大家都听过,喜欢这种烟雾缭绕迷幻的镜像。


Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义的图像的对象.

Bitmap类使用LockBits和UnLockBits方法来将位图的数据矩阵保存在内存中、直接对它进行操作,最后用修改后的数据代替位图中的原始数据。

LockBits方法和UnlockBits方法分别锁定和解锁系统内存中的位图像素.在基于像素点的图像处理方法中使用LockBits和UnlockBits是一个很好的方式,这两种方法可以使我们指定像素的范围来控制位图的任意一部分,从而消除了通过循环对位图的像素逐个进行处理,每调用LockBits之后都应该调用一次UnlockBits.

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

Scan0:被锁定数组的首字节地址,如果整个图像被锁定,则是图像的第一个字节地址.

Stride:步幅,也称为扫描宽度. 数据矩阵中的行宽,以byte为单位。可能会扩展几个Byte。

PixelFormat:数据的实际像素格式,这对矩阵中字节的定位很重要。

Width:位图的宽度。

Height:位图的高度。

如果这个看不懂,我又找了一个,这个比较容易理解。

 

01 /*
02 * 由SharpDevelop创建。
03 * 用户: Lazynight
04 * 日期: 2011/10/24
05 * 时间: 13:42
06 *
07 * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件
08 */
09 using System;
10 using System.Collections.Generic;
11 using System.Drawing;
12 using System.Windows.Forms;
13
14 namespace Lazy24_图像纹理和浮雕效果
15 {
16
17     public partial class MainForm : Form
18     {
19         Bitmap Night_bitmap;//定义共有变量
20         public MainForm()
21         {
22             InitializeComponent();
23         }
24
25         void Button1Click(object sender, EventArgs e)
26         {
27             openFileDialog1.Filter=“*.jpg,*.jpeg,*.bmp,*.gif,*.ico,*.png,*.tif,*.wmf|*.jpg;*.jpeg;*.bmp;*.gif;*.ico;*.png;*.tif;*.wmf”;
28             //设置打开图像的类型
29             this.openFileDialog1.ShowDialog();//打开对话框
30             if(this.openFileDialog1.FileName.Trim()==“”)
31                 return;
32             try
33             {
34                 //把打开的图像赋给Bitmap变量
35                 Bitmap SrcBitmap=new Bitmap(this.openFileDialog1.FileName);
36                 Night_bitmap = new Bitmap(SrcBitmap,this.pictureBox1.Width,this.pictureBox1.Height);
37                 this.pictureBox1.Image=Night_bitmap;// 在picturebox显示图像
38             }
39             catch
40             {
41                 //提示对话框
42                 MessageBox.Show(this,“打开图像文件错误”,“提示”,MessageBoxButtons.OK,MessageBoxIcon.Information);
43             }
44         }
45
46         void Button2Click(object sender, EventArgs e)
47         {
48             Image Lazy_image=System.Drawing.Image.FromFile(openFileDialog1.FileName);
49             Night_bitmap=new Bitmap(Lazy_image);
50             Rectangle rect=new Rectangle(,,Night_bitmap.Width,Night_bitmap.Height);
51             System.Drawing.Imaging.BitmapData Lazy_bmpdata=Night_bitmap.LockBits(rect,System.Drawing.Imaging.ImageLockMode.ReadWrite,Night_bitmap.PixelFormat);
52             //将指定的图像锁定到内存中
53             IntPtr Lazy_ptr=Lazy_bmpdata.Scan0;
54             //获得图像中第一个像素数据的地址
55             int Lazy_bytes=Night_bitmap.Width*Night_bitmap.Height*3;
56             byte[] Lazy_rgbvalues=new byte[Lazy_bytes];
57             System.Runtime.InteropServices.Marshal.Copy(Lazy_ptr,Lazy_rgbvalues,,Lazy_bytes);
58             //使用RGB值为声明的Lazy_rgbvalues数组赋值
59             for(int count=;count<Lazy_rgbvalues.Length;count+=3)
60             {
61                 Lazy_rgbvalues[count]=255;
62             }
63             System.Runtime.InteropServices.Marshal.Copy(Lazy_rgbvalues,,Lazy_ptr,Lazy_bytes);
64             //使用RGB值为图像的像素点着色
65             Night_bitmap.UnlockBits(Lazy_bmpdata);
66             //从内存中解锁图像
67             this.pictureBox1.Image=Night_bitmap;
68
69         }
70
71         void Button3Click(object sender, EventArgs e)
72         {
73             Image Lazy_image=System.Drawing.Image.FromFile(openFileDialog1.FileName);
74             Bitmap Lazy_bitmap =new Bitmap(Lazy_image);//创建Bitmap对象实例
75             for(int i=;i<Lazy_bitmap.Width-1;i++)
76             {
77                 for(int j=;j<Lazy_bitmap.Height-1;j++)
78                 {
79                     Color Color1 =Lazy_bitmap.GetPixel(i,j);
80                     //调用GetPixel方法获取像素点的颜色
81                     Color Color2 =Lazy_bitmap.GetPixel(i+1,j+1);
82                     int red=Math.Abs(Color1.R-Color2.R+128);
83                     int green=Math.Abs(Color1.G-Color2.G+128);
84                     int blue=Math.Abs(Color1.B-Color2.B+128);
85                     if(red>255) red=255;
86                     if(red<) red=;
87                     if(green>255) green=255;
88                     if(green<) green=;
89                     if(blue>255) blue=255;
90                     if(blue<) blue=;
91                     Lazy_bitmap.SetPixel(i,j,Color.FromArgb(red,green,blue));
92                 }
93             }
94             this.pictureBox1.Image=Lazy_bitmap;
95         }
96     }
97 }

下载源码

转载请注明:于哲的博客 » C#每天抄一点(24):图像纹理和浮雕效果