有没有办法将图像转换为每像素格式16位灰度,而不是将每个r,g和b分量设置为亮度 . 我目前有一个文件bmp .
Bitmap c = new Bitmap("filename");
我想要一个Bitmap d,即c的灰度版本 . 我确实看到一个包含System.Drawing.Imaging.PixelFormat的构造函数,但我不明白如何使用它 . 我是Image Processing和相关C#库的新手,但对C#本身有一定的经验 .
任何帮助,参考在线来源,提示或建议将不胜感激 .
编辑:d是c的灰度版本 .
6 回答
总结一下这里的几个项目:有一些逐像素的选项,虽然简单但不快 .
@Luis'评论链接到:(已存档)https://web.archive.org/web/20110827032809/http://www.switchonthecode.com/tutorials/csharp-tutorial-convert-a-color-image-to-grayscale非常棒 .
他经历了三种不同的选择,包括每种选择的时间 .
这是怎么做的
EDIT: 转换为 grayscale
来自switchonthecode的更快版本关注链接以进行全面分析:
这样它也可以保持alpha通道 .
请享用 .
ToolStripRenderer
类中有一个静态方法,名为CreateDisabledImage
. 它的用法很简单:它使用与接受答案中的矩阵稍微不同的矩阵,并且还将其乘以0.7的透明度,因此效果与仅灰度略有不同,但如果您想让图像变灰,那么它是最简单的最佳方案 .
以上示例均未创建8位(8bpp)位图图像 . 某些软件(如图像处理)仅支持8bpp . 不幸的是,MS .NET库没有解决方案 . PixelFormat.Format8bppIndexed格式看起来很有希望但经过多次尝试后我无法正常工作 .
要创建真正的8位位图文件,您需要创建proper headers . 最终我找到了用于创建8位位图(BMP)文件的Grayscale library解决方案 . 代码很简单:
这个项目的代码远非漂亮,但是它有效,只有一个简单易解决的问题 . 作者将图像分辨率硬编码为10x10 . 图像处理程序不喜欢这样 . 修复程序是打开GrayBMP_File.cs(是的,时髦的文件命名,我知道)并用下面的代码替换第50和51行 . 该示例将分辨率设置为200x200,但您应将其更改为正确的数字 .
下面的代码是最简单的解决方案: