上篇文章写了将彩色图片变成黑白照片的一个方法,该方法遍历图片色素,然后通过公式将彩色变成黑白,效率十分低下。
今天做了下修改,效率大概提高了1000倍吧
测试图如下:
214452542是上个方法的执行时间
250169是本次方法执行时间
图如本次方法生成图效果
更改了公式为:Y=0.299*R+0.114*G+0.587B
代码:
1/**////<summary>
2///快速的将彩色图像变成黑白图像-目前仅适用于jpg格式的图像
3///</summary>
4///<paramname="filePath">彩色图像地址</param>
5///<returns>返回的黑白图像</returns>
6publicstaticBitmapQuickWhiteAndBlack(stringfilePath)
7{
8
9//从文件创建Bitmap对象
10Bitmapbmp=newBitmap(filePath);
11
12//将Bitmap锁定到系统内存中
13Rectanglerect=newRectangle(0,0,bmp.Width,bmp.Height);
14//获得BitmapData
15System.Drawing.Imaging.BitmapDatabmpData=
16bmp.LockBits(rect,System.Drawing.Imaging.ImageLockMode.ReadWrite,
17bmp.PixelFormat);
18
19//位图中第一个像素数据的地址。它也可以看成是位图中的第一个扫描行
20IntPtrptr=bmpData.Scan0;
21
22//将Bitmap对象的信息存放到byte数组中
23//假设位图中一个像素包含3byte,也就是24bit
24intbytes=bmp.Width*bmp.Height*3;
25byte[]rgbValues=newbyte[bytes];
26
27//复制GRB信息到byte数组
28System.Runtime.InteropServices.Marshal.Copy(ptr,rgbValues,0,bytes);
29
30//根据Y=0.299*R+0.114*G+0.587B,Y为亮度
31for(intcounter=0;counter<rgbValues.Length;counter+=3)
32{
33bytevalue=(byte)(rgbValues[counter]*0.299+rgbValues[counter+2]*0.114+rgbValues[counter+1]*0.587);
34rgbValues[counter]=value;
35rgbValues[counter+1]=value;
36rgbValues[counter+2]=value;
37}
38
39//将更改过的byte[]拷贝到原位图
40System.Runtime.InteropServices.Marshal.Copy(rgbValues,0,ptr,bytes);
41
42//解锁位图
43bmp.UnlockBits(bmpData);
44returnbmp;
45
46} 上篇地址:/jillzhang/archive//10/09/524571.html
特别感谢:YaoTong
ahnan
沐枫
三位兄弟在上篇文章对我的帮助!