加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何转换像素格式?从Cb的32bppRGB到16bpp灰度

发布时间:2020-12-15 05:39:09 所属栏目:百科 来源:网络整理
导读:我需要为我的图像做一些阈值处理.阈值滤波器功能只接受8-16bpp灰度.我的位图图片具有32bppRGB像素格式.请为此建议一些代码. (我也想知道是否有可能没有像素操作) 附:我正在使用Aforge.NET进行阈值处理. 谢谢 -Sagar 解决方法 最简单的方法: public static
我需要为我的图像做一些阈值处理.阈值滤波器功能只接受8-16bpp灰度.我的位图图片具有32bppRGB像素格式.请为此建议一些代码. (我也想知道是否有可能没有像素操作)

附:我正在使用Aforge.NET进行阈值处理.

谢谢

-Sagar

解决方法

最简单的方法:
public static Bitmap MakeGrayscale(Bitmap original)
 {
    //make an empty bitmap the same size as original
    Bitmap newBitmap = new Bitmap(original.Width,original.Height);

   for (int i = 0; i < original.Width; i++)
    {
       for (int j = 0; j < original.Height; j++)
       {
          //get the pixel from the original image
          Color originalColor = original.GetPixel(i,j);

         //create the grayscale version of the pixel
          int grayScale = (int)((originalColor.R * .3) + (originalColor.G * .59)
              + (originalColor.B * .11));

         //create the color object
          Color newColor =  Color.FromArgb(grayScale,grayScale,grayScale);

          //set the new image's pixel to the grayscale version
          newBitmap.SetPixel(i,j,newColor);
         }
     }

    return newBitmap;
 }

更快的方式:

public static Bitmap MakeGrayscale2(Bitmap original)
 {
    unsafe
    {
       //create an empty bitmap the same size as original
       Bitmap newBitmap = new Bitmap(original.Width,original.Height);

      //lock the original bitmap in memory
       BitmapData originalData = original.LockBits(
          new Rectangle(0,original.Width,original.Height),ImageLockMode.ReadOnly,PixelFormat.Format24bppRgb);

      //lock the new bitmap in memory
       BitmapData newData = newBitmap.LockBits(
          new Rectangle(0,ImageLockMode.WriteOnly,PixelFormat.Format24bppRgb);

       //set the number of bytes per pixel
       int pixelSize = 3;

      for (int y = 0; y < original.Height; y++)
       {
          //get the data from the original image
          byte* oRow = (byte*)originalData.Scan0 + (y * originalData.Stride);

         //get the data from the new image
          byte* nRow = (byte*)newData.Scan0 + (y * newData.Stride);

         for (int x = 0; x < original.Width; x++)
          {
             //create the grayscale version
             byte grayScale = 
               (byte)((oRow[x * pixelSize] * .11) + //B
                (oRow[x * pixelSize + 1] * .59) +  //G
                (oRow[x * pixelSize + 2] * .3)); //R

            //set the new image's pixel to the grayscale version
             nRow[x * pixelSize] = grayScale; //B
             nRow[x * pixelSize + 1] = grayScale; //G
             nRow[x * pixelSize + 2] = grayScale; //R
          }
       }

      //unlock the bitmaps
       newBitmap.UnlockBits(newData);
       original.UnlockBits(originalData);

      return newBitmap;
    }
 }

最快的方式:

public static Bitmap MakeGrayscale3(Bitmap original)
 {
    //create a blank bitmap the same size as original
    Bitmap newBitmap = new Bitmap(original.Width,original.Height);

    //get a graphics object from the new image
    Graphics g = Graphics.FromImage(newBitmap);

   //create the grayscale ColorMatrix
    ColorMatrix colorMatrix = new ColorMatrix(
       new float[][] 
      {
          new float[] {.3f,.3f,0},new float[] {.59f,.59f,new float[] {.11f,.11f,new float[] {0,1,1}
       });

   //create some image attributes
    ImageAttributes attributes = new ImageAttributes();

   //set the color matrix attribute
    attributes.SetColorMatrix(colorMatrix);

   //draw the original image on the new image
    //using the grayscale color matrix
    g.DrawImage(original,new Rectangle(0,original.Height,GraphicsUnit.Pixel,attributes);

   //dispose the Graphics object
    g.Dispose();
    return newBitmap;
 }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读