有没有办法将图像转换为每像素格式16位灰度,而不是将每个r,g和b分量设置为亮度.我目前有一个文件bmp.
Bitmap c = new Bitmap("filename");
Run Code Online (Sandbox Code Playgroud)
我想要一个Bitmap d,即c的灰度版本.我确实看到一个包含System.Drawing.Imaging.PixelFormat的构造函数,但我不明白如何使用它.我是Image Processing和相关C#库的新手,但对C#本身有一定的经验.
任何帮助,参考在线来源,提示或建议将不胜感激.
编辑:d是c的灰度版本.
我试图将图像保存为单色(黑白,1位深度),但我现在失去了如何做到这一点.
我开始用一个PNG,并转换为位图打印(这是一个热敏打印机,仅支持黑色反正 - 加上它的地狱大型图像慢,如果我尝试将它们发送的彩色/灰度).
到目前为止,我的代码很简单,无法将其转换为位图,但它保留了原始颜色深度.
Image image = Image.FromFile("C:\\test.png");
byte[] bitmapFileData = null;
int bitsPerPixel = 1;
int bitmapDataLength;
using (MemoryStream str = new MemoryStream())
{
image.Save(str, ImageFormat.Bmp);
bitmapFileData = str.ToArray();
}
Run Code Online (Sandbox Code Playgroud) 我想将图像更改为Black-White或Sepia.转换图像后,我想用转换后的图像替换现有图像.
请给我一些建议.
我想在代码和按需中将32位RGBA Image对象(最初是32位PNG)转换为32位灰度对应物.
我已经在这里阅读了其他几个问题,以及很多在线文章.我已经尝试过使用ColorMatrix来做到这一点,但它似乎并没有很好地处理alpha.完全不透明灰度的像素完美无缺.任何部分透明的像素似乎都不能很好地转换,因为这些像素中仍然存在色彩.这足以引人注目.
我使用的ColorMatrix如下:
new System.Drawing.Imaging.ColorMatrix(new float[][]{
new float[] {0.299f, 0.299f, 0.299f, 0, 0},
new float[] {0.587f, 0.587f, 0.587f, 0, 0},
new float[] {0.114f, 0.114f, 0.114f, 0, 0},
new float[] { 0, 0, 0, 1, 0},
new float[] { 0, 0, 0, 0, 1}
});
Run Code Online (Sandbox Code Playgroud)
正如我所读到的,这是一个非常标准的NTSC加权矩阵.我随后使用它,Graphics.DrawImage但正如我所说,部分透明像素仍然是彩色的.我应该指出这是通过WinForms PictureBox在白色背景上显示Image对象.它可能只是PictureBox绘制图像和处理透明部分的方式吗?背景颜色不会影响它(颜色的色调肯定来自原始图像),但也许PictureBox没有正确地重绘透明像素?
我见过一些使用FormatConvertedBitmap和OpacityMask的方法.我没有尝试过,主要是因为我真的不想导入PresentationCore.dll(更不用说这意味着它不适用于.NET 2.0有限的应用程序).当然基本的System.Drawing.*东西可以做这个简单的程序吗?或不?