将图像转换为灰度

将图像转换为灰度

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

Bitmap c = new Bitmap("filename");

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

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


翻阅古今
浏览 497回答 3
3回答

幕布斯7119047

“我想要一个Bitmap d,即灰度。我确实看到一个包含System.Drawing.Imaging.PixelFormat的consructor,但我不明白如何使用它。”这是怎么做的Bitmap&nbsp;grayScaleBP&nbsp;=&nbsp;new&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Drawing.Bitmap(2,&nbsp;2,&nbsp;System.Drawing.Imaging.PixelFormat.Format16bppGrayScale);编辑:转换为灰度&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bitmap&nbsp;c&nbsp;=&nbsp;new&nbsp;Bitmap("fromFile"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bitmap&nbsp;d; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;x,&nbsp;y; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Loop&nbsp;through&nbsp;the&nbsp;images&nbsp;pixels&nbsp;to&nbsp;reset&nbsp;color. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(x&nbsp;=&nbsp;0;&nbsp;x&nbsp;<&nbsp;c.Width;&nbsp;x++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(y&nbsp;=&nbsp;0;&nbsp;y&nbsp;<&nbsp;c.Height;&nbsp;y++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Color&nbsp;pixelColor&nbsp;=&nbsp;c.GetPixel(x,&nbsp;y); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Color&nbsp;newColor&nbsp;=&nbsp;Color.FromArgb(pixelColor.R,&nbsp;0,&nbsp;0); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.SetPixel(x,&nbsp;y,&nbsp;newColor);&nbsp;//&nbsp;Now&nbsp;greyscale &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;=&nbsp;c;&nbsp;&nbsp;&nbsp;//&nbsp;d&nbsp;is&nbsp;grayscale&nbsp;version&nbsp;of&nbsp;c来自switchonthecode的更快版本跟随链接进行全面分析:public&nbsp;static&nbsp;Bitmap&nbsp;MakeGrayscale3(Bitmap&nbsp;original){ &nbsp;&nbsp;&nbsp;//create&nbsp;a&nbsp;blank&nbsp;bitmap&nbsp;the&nbsp;same&nbsp;size&nbsp;as&nbsp;original &nbsp;&nbsp;&nbsp;Bitmap&nbsp;newBitmap&nbsp;=&nbsp;new&nbsp;Bitmap(original.Width,&nbsp;original.Height); &nbsp;&nbsp;&nbsp;//get&nbsp;a&nbsp;graphics&nbsp;object&nbsp;from&nbsp;the&nbsp;new&nbsp;image &nbsp;&nbsp;&nbsp;Graphics&nbsp;g&nbsp;=&nbsp;Graphics.FromImage(newBitmap); &nbsp;&nbsp;&nbsp;//create&nbsp;the&nbsp;grayscale&nbsp;ColorMatrix &nbsp;&nbsp;&nbsp;ColorMatrix&nbsp;colorMatrix&nbsp;=&nbsp;new&nbsp;ColorMatrix( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;float[][]&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;float[]&nbsp;{.3f,&nbsp;.3f,&nbsp;.3f,&nbsp;0,&nbsp;0}, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;float[]&nbsp;{.59f,&nbsp;.59f,&nbsp;.59f,&nbsp;0,&nbsp;0}, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;float[]&nbsp;{.11f,&nbsp;.11f,&nbsp;.11f,&nbsp;0,&nbsp;0}, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;float[]&nbsp;{0,&nbsp;0,&nbsp;0,&nbsp;1,&nbsp;0}, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;float[]&nbsp;{0,&nbsp;0,&nbsp;0,&nbsp;0,&nbsp;1} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;&nbsp;//create&nbsp;some&nbsp;image&nbsp;attributes &nbsp;&nbsp;&nbsp;ImageAttributes&nbsp;attributes&nbsp;=&nbsp;new&nbsp;ImageAttributes(); &nbsp;&nbsp;&nbsp;//set&nbsp;the&nbsp;color&nbsp;matrix&nbsp;attribute &nbsp;&nbsp;&nbsp;attributes.SetColorMatrix(colorMatrix); &nbsp;&nbsp;&nbsp;//draw&nbsp;the&nbsp;original&nbsp;image&nbsp;on&nbsp;the&nbsp;new&nbsp;image &nbsp;&nbsp;&nbsp;//using&nbsp;the&nbsp;grayscale&nbsp;color&nbsp;matrix &nbsp;&nbsp;&nbsp;g.DrawImage(original,&nbsp;new&nbsp;Rectangle(0,&nbsp;0,&nbsp;original.Width,&nbsp;original.Height), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;0,&nbsp;original.Width,&nbsp;original.Height,&nbsp;GraphicsUnit.Pixel,&nbsp;attributes); &nbsp;&nbsp;&nbsp;//dispose&nbsp;the&nbsp;Graphics&nbsp;object &nbsp;&nbsp;&nbsp;g.Dispose(); &nbsp;&nbsp;&nbsp;return&nbsp;newBitmap;}

小怪兽爱吃肉

Bitmap&nbsp;d&nbsp;=&nbsp;new&nbsp;Bitmap(c.Width,&nbsp;c.Height);for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;c.Width;&nbsp;i++){ &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;x&nbsp;=&nbsp;0;&nbsp;x&nbsp;<&nbsp;c.Height;&nbsp;x++) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Color&nbsp;oc&nbsp;=&nbsp;c.GetPixel(i,&nbsp;x); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;grayScale&nbsp;=&nbsp;(int)((oc.R&nbsp;*&nbsp;0.3)&nbsp;+&nbsp;(oc.G&nbsp;*&nbsp;0.59)&nbsp;+&nbsp;(oc.B&nbsp;*&nbsp;0.11)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Color&nbsp;nc&nbsp;=&nbsp;Color.FromArgb(oc.A,&nbsp;grayScale,&nbsp;grayScale,&nbsp;grayScale); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d.SetPixel(i,&nbsp;x,&nbsp;nc); &nbsp;&nbsp;&nbsp;&nbsp;}}这样它也可以保持alpha通道。&nbsp;

冉冉说

在ToolStripRenderer类中有一个静态方法,名为CreateDisabledImage。它的用法很简单:Bitmap&nbsp;c&nbsp;=&nbsp;new&nbsp;Bitmap("filename");Image&nbsp;d&nbsp;=&nbsp;ToolStripRenderer.CreateDisabledImage(c);它使用与接受答案中的矩阵稍微不同的矩阵,并且还将其乘以0.7的透明度,因此效果与仅灰度略有不同,但如果您想让图像变灰,那么它是最简单的最佳方案。
打开App,查看更多内容
随时随地看视频慕课网APP