将图像转换为灰度

有没有办法将图像转换为灰度16位像素格式,而不是设置每个r,g和b组件的亮度。 我目前有一个从文件bmp。

Bitmap c = new Bitmap("filename"); 

我想要一个位图d,即c的灰度版本。 我看到包含System.Drawing.Imaging.PixelFormat的构造函数,但我不明白如何使用它。 我是image processing和相关C#库的新手,但对C#本身有一定的经验。

任何帮助,参考在线来源,暗示或build议将不胜感激。

谢谢。

编辑:D是C的灰度版本。

“我想要一个位图d,即灰度图,我看到一个包含System.Drawing.Imaging.PixelFormat的consructor,但是我不明白如何使用它。

这是如何做到这一点

 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; } 
 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通道。
请享用。

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

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

他运行了三个不同的选项,包括每个选项的时间。

上面的例子都没有创build8位(8bpp)的位图图像。 一些软件,如image processing,只支持8bpp。 不幸的是MS .NET库没有解决scheme。 PixelFormat.Format8bppIndexed格式看起来很有前途,但经过很多尝试,我无法得到它的工作。

要创build一个真正的8位位图文件,您需要创build正确的标题 。 最终我find了创build8位位图(BMP)文件的灰度库解决scheme。 代码非常简单:

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

这个项目的代码是不是很漂亮,但它的工作原理,一个简单的问题。 作者将图像分辨率硬编码为10×10。 image processing程序不喜欢这个。 修复是打开GrayBMP_File.cs(是的,时髦的文件命名,我知道),并用下面的代码replace行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); 

ToolStripRenderer类中有一个名为CreateDisabledImage的静态方法。 它的使用简单如下:

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

它使用的matrix与接受的答案中的matrix略有不同,并且将其乘以值为0.7的透明度,所以其效果与灰度稍有不同,但如果只想让图像变成灰色,则是最简单的方法最佳解决scheme

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

 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 = cR; int g = cG; int b = cB; int avg = (r + g + b) / 3; bt.SetPixel(x, y, Color.FromArgb(avg,avg,avg)); } } bt.Save("d:\\out.bmp");