将图像转换为灰度将图像转换为灰度(Convert an image to grayscale)

2019-05-09 02:44发布

有一种方法,以图像为灰度每像素格式16位,而不是每个R,G和B分量的设置亮度转换。 我现在有从文件中的BMP。

Bitmap c = new Bitmap("filename");

我想一个位图d,这为c的灰度版本。 我看到一个构造函数,包括System.Drawing.Imaging.PixelFormat,但我不知道如何使用它。 我是新的图像处理和相关的C#库,但与C#本身就是一个温和的经验。

任何帮助,参考在线资源,提示或建议,将不胜感激。

编辑:d c的灰度版本。

Answer 1:

“我希望有一个位图d,那就是灰色的。我确实看到了consructor包括System.Drawing.Imaging.PixelFormat,但我不知道如何使用。”

这里是如何做到这一点

Bitmap grayScaleBP = new 
         System.Drawing.Bitmap(2, 2, System.Drawing.Imaging.PixelFormat.Format16bppGrayScale);

编辑:要转换为灰度

             Bitmap c = new Bitmap("fromFile");
             Bitmap d;
             int x, y;

             // Loop through the images pixels to reset color.
             for (x = 0; x < c.Width; x++)
             {
                 for (y = 0; y < c.Height; y++)
                 {
                     Color pixelColor = c.GetPixel(x, y);
                     Color newColor = Color.FromArgb(pixelColor.R, 0, 0);
                     c.SetPixel(x, y, newColor); // Now greyscale
                 }
             }
            d = c;   // d is grayscale version of c  

从更快的版本switchonthecode后续链接,全面分析:

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, .3f, 0, 0},
         new float[] {.59f, .59f, .59f, 0, 0},
         new float[] {.11f, .11f, .11f, 0, 0},
         new float[] {0, 0, 0, 1, 0},
         new float[] {0, 0, 0, 0, 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, 0, original.Width, original.Height),
      0, 0, original.Width, original.Height, GraphicsUnit.Pixel, attributes);

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


Answer 2:

Bitmap d = new Bitmap(c.Width, c.Height);

for (int i = 0; i < c.Width; i++)
{
    for (int x = 0; x < c.Height; x++)
    {
        Color oc = c.GetPixel(i, x);
        int grayScale = (int)((oc.R * 0.3) + (oc.G * 0.59) + (oc.B * 0.11));
        Color nc = Color.FromArgb(oc.A, grayScale, grayScale, grayScale);
        d.SetPixel(i, x, nc);
    }
}

这样,它也保持alpha通道。
请享用。



Answer 3:

有一个静态方法ToolStripRenderer类,命名CreateDisabledImage 。 它的使用是非常简单:

Bitmap c = new Bitmap("filename");
Image d = ToolStripRenderer.CreateDisabledImage(c);

它使用一个比接受的答案有点不同的矩阵,另外由值0.7的透明度相乘,所以效果不只是灰度略有不同,但如果你只想得到你的图像显示为灰色,这是最简单,最好的解决办法。



Answer 4:

这里总结了几个项目:有一些逐像素的选择,虽然是简单的就是不能快。

@Luis'评论链接:(存档) https://web.archive.org/web/20110827032809/http://www.switchonthecode.com/tutorials/csharp-tutorial-convert-a-color-image-to-灰度是一流的。

他贯穿三个不同的选项,包括为每个计时。



Answer 5:

的实施例中没有上述创建的8位(8bpp的)位图图像。 一些软件,如图像处理,只支持8bpp的。 不幸的是,MS .NET库没有一个解决方案。 该PixelFormat.Format8bppIndexed格式看起来很有希望,但很多的尝试我无法得到它的工作后,

要创建一个真正的8位位图文件,你需要创建适当的标题 。 最终,我找到了灰度库创建8位位图(BMP)文件的解决方案。 该代码非常简单:

Image image = Image.FromFile("c:/path/to/image.jpg");
GrayBMP_File.CreateGrayBitmapFile(image, "c:/path/to/8bpp/image.bmp");

该项目的代码是远离漂亮,但它的工作原理,用一个小小的简单到修复问题。 笔者硬编码的图像分辨率10×10。 图像处理程序不喜欢这样。 解决方法是打开GrayBMP_File.cs(是的,时髦的文件命名,我知道)和替换线50和51与下面的代码。 的例子设置分辨率为200×200,但你应该将其更改为正确的号码。

int resX = 200;
int resY = 200;
// horizontal resolution
Copy_to_Index(DIB_header, BitConverter.GetBytes(resX * 100), 24);
// vertical resolution 
Copy_to_Index(DIB_header, BitConverter.GetBytes(resY * 100), 28);


Answer 6:

下面的代码是最简单的解决方案:

Bitmap bt = new Bitmap("imageFilePath");

for (int y = 0; y < bt.Height; y++)
{
    for (int x = 0; x < bt.Width; x++)
    {
        Color c = bt.GetPixel(x, y);

        int r = c.R;
        int g = c.G;
        int b = c.B;
        int avg = (r + g + b) / 3;
        bt.SetPixel(x, y, Color.FromArgb(avg,avg,avg));
    }   
}

bt.Save("d:\\out.bmp");


文章来源: Convert an image to grayscale