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


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

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

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

    38
    39            //将更改过的byte[]拷贝到原位图
    40            System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);
    41
    42            // 解锁位图
    43            bmp.UnlockBits(bmpData);
    44            return bmp;
    45
    46        }
    上篇地址:http://www.cnblogs.com/jillzhang/archive/2006/10/09/524571.html
    特别感谢:YaoTong 
                     ahnan 
                     沐枫
                     三位兄弟在上篇文章对我的帮助!
  • 相关阅读:
    《面向模式的软件体系结构1模式系统》读书笔记(7) 通信
    《面向模式的软件体系结构2用于并发和网络化对象模式》读书笔记(5) 截取器
    Enum variable is used in switch sentencejava Anny
    How to create a dynamic range source(转) Anny
    Managing Range Names in Excel 2010(转) Anny
    Mixed Content Handling Issue on IE7/8 Anny
    How to resolve "skip non existing resourceDirectory" when using "mvn test" Anny
    Install chinese input method in Ubuntu12.04 Anny
    IDL(International Date Line) Anny
    Web Accessibility508(转) Anny
  • 原文地址:https://www.cnblogs.com/jillzhang/p/528645.html
Copyright © 2020-2023  润新知