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

上篇文章写了将彩色图片变成黑白照片的一个方法,该方法遍历图片色素,然后通过公式将彩色变成黑白,效率十分低下。
今天做了下修改,效率大概提高了1000倍吧
测试图如下:

214452542是上个方法的执行时间
250169是本次方法执行时间
图如本次方法生成图效果
更改了公式为:Y=0.299*R+0.114*G+0.587B
代码:
 1 ExpandedBlockStart.gif ContractedBlock.gif /**/ /// <summary>
 2InBlock.gif        /// 快速的将彩色图像变成黑白图像-目前仅适用于jpg格式的图像 
 3InBlock.gif        /// </summary>
 4InBlock.gif        /// <param name="filePath">彩色图像地址</param>
 5ExpandedBlockEnd.gif        /// <returns>返回的黑白图像</returns>

 6 None.gif          public   static  Bitmap QuickWhiteAndBlack( string  filePath)
 7 ExpandedBlockStart.gifContractedBlock.gif         dot.gif {
 8InBlock.gif
 9InBlock.gif            // 从文件创建Bitmap对象
10InBlock.gif            Bitmap bmp = new Bitmap(filePath);
11InBlock.gif
12InBlock.gif            // 将Bitmap锁定到系统内存中
13InBlock.gif            Rectangle rect = new Rectangle(00, bmp.Width, bmp.Height);
14InBlock.gif            // 获得BitmapData
15InBlock.gif            System.Drawing.Imaging.BitmapData bmpData =
16InBlock.gif                bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
17InBlock.gif                bmp.PixelFormat);
18InBlock.gif
19InBlock.gif            // 位图中第一个像素数据的地址。它也可以看成是位图中的第一个扫描行
20InBlock.gif            IntPtr ptr = bmpData.Scan0;
21InBlock.gif
22InBlock.gif            // 将Bitmap对象的信息存放到byte数组中
23InBlock.gif            // 假设位图中一个像素包含3byte,也就是24bit
24InBlock.gif            int bytes = bmp.Width * bmp.Height * 3;
25InBlock.gif            byte[] rgbValues = new byte[bytes];
26InBlock.gif
27InBlock.gif            //复制GRB信息到byte数组
28InBlock.gif            System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);
29InBlock.gif
30InBlock.gif            // 根据Y=0.299*R+0.114*G+0.587B,Y为亮度
31InBlock.gif            for (int counter = 0; counter < rgbValues.Length; counter += 3)
32ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
33InBlock.gif                byte value = (byte)(rgbValues[counter] * 0.299 + rgbValues[counter + 2* 0.114 + rgbValues[counter + 1* 0.587);
34InBlock.gif                rgbValues[counter] = value;
35InBlock.gif                rgbValues[counter + 1= value;
36InBlock.gif                rgbValues[counter + 2= value;
37ExpandedSubBlockEnd.gif            }

38InBlock.gif
39InBlock.gif            //将更改过的byte[]拷贝到原位图
40InBlock.gif            System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);
41InBlock.gif
42InBlock.gif            // 解锁位图
43InBlock.gif            bmp.UnlockBits(bmpData);
44InBlock.gif            return bmp;
45InBlock.gif
46ExpandedBlockEnd.gif        }
上篇地址: http://www.cnblogs.com/jillzhang/archive/2006/10/09/524571.html
特别感谢: YaoTong 
                 ahnan 
                 沐枫
                 三位兄弟在上篇文章对我的帮助!
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值