zoukankan      html  css  js  c++  java
  • 图像处理---染色

    1.效果图:
            此效果图使用的选染色为Color.Yellow
            

    2.实现原理:
            首先指定一种渲染颜色,然后计算当前象素的灰度值,用当前象素的灰度值分别乘以渲染色的R、G、B
            分量值,将结果做为当前象素的最终颜色

    3.实现代码: 


     1        /// <summary>
     2        /// 染色
     3        /// </summary>
     4        /// <param name="img">原始图像</param>
     5        /// <param name="color">指定渲染色</param>
     6        /// <returns></returns>
     7        public static Image Colorize(Image img, Color color)
     8        {
     9            //初始化变量
    10            Bitmap bmp = new Bitmap(img);
    11            int width = img.Width;
    12            int height = img.Height;
    13
    14            //获取Color对象的R、G、B分量值
    15            byte red = color.R;
    16            byte green = color.G;
    17            byte blue = color.B;
    18
    19            //将Bitmap对象锁定到系统内存中
    20            Rectangle rect = new Rectangle(0, 0, width, height);
    21            ImageLockMode flag = ImageLockMode.ReadWrite;
    22            PixelFormat format = PixelFormat.Format32bppArgb;
    23            BitmapData data = bmp.LockBits(rect, flag, format);
    24
    25            //初始化一个byte类型的数组
    26            int numBytes = width * height * 4;
    27            byte[] rgbValues = new byte[numBytes];
    28
    29            //将非托管的内存指针复制到数组
    30            IntPtr ptr = data.Scan0;
    31            Marshal.Copy(ptr, rgbValues, 0, numBytes);
    32
    33            //修改每个象素R、G、B分量的值
    34            int gray;
    35            for (int i = 0; i < numBytes; i += 4)
    36            {
    37                //计算当前象素的灰度值
    38                gray = (rgbValues[i] + rgbValues[i + 1] + rgbValues[i + 2]) / 3;
    39
    40                //染色后的R、G、B分量值
    41                rgbValues[i] = (byte)(blue * gray / 255);
    42                rgbValues[i+1] = (byte)(green * gray / 255);
    43                rgbValues[i+2] = (byte)(red * gray / 255);
    44            }
    45
    46            //将数组复制到非托管的内存指针
    47            Marshal.Copy(rgbValues, 0, ptr, numBytes);
    48
    49            //从内存中解锁Bitmap
    50            bmp.UnlockBits(data);
    51
    52            //返回值
    53            return (Image)bmp;
    54        }

    4.说明:
             计算灰度值可参考:图像处理:黑白效果(灰度处理)

  • 相关阅读:
    理财课堂笔记第9天
    李筱懿的《先谋生,再谋爱》读后感
    bat想要写一个卸载软件的脚本,最后宣布失败[未完待续...]
    理财课堂日记第7天
    理财课堂日记第6天
    理财课堂日记第5天
    bat脚本登陆ftp服务器
    理财课堂笔记第4天
    理财课堂日记第3天
    理财课堂日记第2天
  • 原文地址:https://www.cnblogs.com/jameslong/p/3805991.html
Copyright © 2011-2022 走看看