700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 快速将彩色照片变成黑白照片(仅适用于jpg格式)

快速将彩色照片变成黑白照片(仅适用于jpg格式)

时间:2023-07-13 02:07:35

相关推荐

快速将彩色照片变成黑白照片(仅适用于jpg格式)

上篇文章写了将彩色图片变成黑白照片的一个方法,该方法遍历图片色素,然后通过公式将彩色变成黑白,效率十分低下。

今天做了下修改,效率大概提高了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

沐枫

三位兄弟在上篇文章对我的帮助!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。