zoukankan      html  css  js  c++  java
  • 灰度处理

    将彩色的图片转换成黑白有很多种方法:

    1。红色转换灰度

      Bitmap desc = new Bitmap(source.Width, source.Height);

    BitmapData sourcedata = source.LockBits(new Rectangle(00, source.Width, source.Height), 
                    ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
    BitmapData descdata 
    = desc.LockBits(new Rectangle(00, desc.Width, desc.Height),
                    ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);

    unsafe
    {
          
    byte* sourceptr = (byte*)sourcedata.Scan0;  //B,G,R
          sourceptr += 2;
          
    byte* descptr = (byte*)descdata.Scan0;
          
    for (int x = 0; x < source.Height; x++)
          {
               
    for (int y = 0; y < source.Width; y++)
               {
                    
    *(descptr++= *sourceptr;
                    
    *(descptr++= *sourceptr;
                    
    *(descptr++= *sourceptr;
                    sourceptr 
    += 3;
                }
                sourceptr 
    += sourcedata.Stride - source.Width * 3;
                descptr 
    += descdata.Stride - desc.Width * 3;
           }
    }
    source.UnlockBits(sourcedata);
    desc.UnlockBits(descdata);

    2。绿色转换灰度

    Bitmap desc = new Bitmap(source.Width, source.Height);
    BitmapData sourcedata 
    = source.LockBits(new Rectangle(00, source.Width, source.Height), 
                    ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
    BitmapData descdata 
    = desc.LockBits(new Rectangle(00, desc.Width, desc.Height),
                    ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);

    unsafe
    {
          
    byte* sourceptr = (byte*)sourcedata.Scan0;  //B,G,R
          sourceptr += 1;
          
    byte* descptr = (byte*)descdata.Scan0;
          
    for (int x = 0; x < source.Height; x++)
          {
               
    for (int y = 0; y < source.Width; y++)
               {
                    
    *(descptr++= *sourceptr;
                    
    *(descptr++= *sourceptr;
                    
    *(descptr++= *sourceptr;
                    sourceptr 
    += 3;
                }
                sourceptr 
    += sourcedata.Stride - source.Width * 3;
                descptr 
    += descdata.Stride - desc.Width * 3;
           }
    }
    source.UnlockBits(sourcedata);
    desc.UnlockBits(descdata);

    3。蓝色转换灰度

     Bitmap desc = new Bitmap(source.Width, source.Height);

    BitmapData sourcedata = source.LockBits(new Rectangle(00, source.Width, source.Height), 
                    ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
    BitmapData descdata 
    = desc.LockBits(new Rectangle(00, desc.Width, desc.Height),
                    ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);

    unsafe
    {
          
    byte* sourceptr = (byte*)sourcedata.Scan0;  //B,G,R
          byte* descptr = (byte*)descdata.Scan0;
          
    for (int x = 0; x < source.Height; x++)
          {
               
    for (int y = 0; y < source.Width; y++)
               {
                    
    *(descptr++= *sourceptr;
                    
    *(descptr++= *sourceptr;
                    
    *(descptr++= *sourceptr;
                    sourceptr 
    += 3;
                }
                sourceptr 
    += sourcedata.Stride - source.Width * 3;
                descptr 
    += descdata.Stride - desc.Width * 3;
           }
    }
    source.UnlockBits(sourcedata);
    desc.UnlockBits(descdata);

    4。平均转换灰度

    Bitmap desc = new Bitmap(source.Width, source.Height);
    BitmapData sourcedata 
    = source.LockBits(new Rectangle(00, source.Width, source.Height), 
                    ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
    BitmapData descdata 
    = desc.LockBits(new Rectangle(00, desc.Width, desc.Height),
                    ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);

    unsafe
    {
          
    byte* sourceptr = (byte*)sourcedata.Scan0;  //B,G,R
          byte* descptr = (byte*)descdata.Scan0;
          
    for (int x = 0; x < source.Height; x++)
          {
               
    for (int y = 0; y < source.Width; y++)
               {
                    
    *(descptr) = *(descptr + 1= *(descptr + 2= (byte)((*sourceptr + *(sourceptr + 1+ *(sourceptr + 2)) / 3);
                    descptr 
    += 3;
                    sourceptr 
    += 3;
                }
                sourceptr 
    += sourcedata.Stride - source.Width * 3;
                descptr 
    += descdata.Stride - desc.Width * 3;
           }
    }
    source.UnlockBits(sourcedata);
    desc.UnlockBits(descdata);

    5。加权平均转换灰度

    Bitmap desc = new Bitmap(source.Width, source.Height);
    BitmapData sourcedata 
    = source.LockBits(new Rectangle(00, source.Width, source.Height), 
                    ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
    BitmapData descdata 
    = desc.LockBits(new Rectangle(00, desc.Width, desc.Height),
                    ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);

    unsafe
    {
          
    byte* sourceptr = (byte*)sourcedata.Scan0;  //B,G,R
          byte* descptr = (byte*)descdata.Scan0;
          
    for (int x = 0; x < source.Height; x++)
          {
               
    for (int y = 0; y < source.Width; y++)
               {
                    
    *(descptr) = *(descptr + 1= *(descptr + 2= (byte)(*sourceptr * 0.11 + *(sourceptr + 1* 0.58 + *(sourceptr + 2* 0.31);
                    descptr 
    += 3;
                    sourceptr 
    += 3;
                }
                sourceptr 
    += sourcedata.Stride - source.Width * 3;
                descptr 
    += descdata.Stride - desc.Width * 3;
           }
    }
    source.UnlockBits(sourcedata);
    desc.UnlockBits(descdata);
  • 相关阅读:
    初探 Linux
    操作系统简介
    1208. 尽可能使字符串相等
    643. 子数组最大平均数 I
    480. 滑动窗口中位数
    Bisect in Python
    HTTP 和 HTTPS 的区别
    URI和URL的区别
    HTTP 1.0和HTTP 1.1的主要区别是什么?
    MySQL游标的使用笔记大全
  • 原文地址:https://www.cnblogs.com/pennant/p/1821807.html
Copyright © 2011-2022 走看看