我希望在代码中并根据需要将32位RGBA图像对象(最初是32位PNG)转换为其32位灰度对象。如何将32位RGBA图像转换为保存灰度图的alpha
我已经在这里read几个other问题,以及在线许多文章。我尝试过使用ColorMatrix来做到这一点,但它似乎并没有很好地处理Alpha。像素完全不透明的灰度。任何部分透明的像素似乎都不能很好地平移,因为这些像素中仍有色彩。足以引人注目。我用
嘉洛斯如下:
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}
});
这是,因为我读过,一个非常标准的NTSC加权矩阵。然后我使用它,连同Graphics.DrawImage
,但正如我所说,部分透明的像素仍然是彩色的。我应该指出这是通过在白色背景上的WinForms PictureBox
显示Image对象。它可能只是PictureBox绘制图像和处理透明部分的方式吗?背景颜色不会影响它(颜色的颜色肯定来自原始图像),但PictureBox可能不会正确重绘透明像素?
我见过一些使用FormatConvertedBitmap和OpacityMask的方法。我还没有尝试过,主要是因为我真的不想导入PresentationCore.dll(更不用说这意味着它不能在.NET 2.0有限的应用程序中工作)。当然基本的System.Drawing。*的东西可以做到这一简单的过程?或不?
你确定颜色的色调不是由于背后的图像?只要RGB值完全相等,就不会有任何色差。发布您的ColorMatrix定义。 – ChrisF 2010-06-16 14:03:47
我确定它不是。该图像通过PictureBox呈现。当然,PictureBox的背景是透明的,这实际上意味着它使用父级的颜色,在这种情况下,它是白色的。但是,新灰度图像的透明边缘仍然呈绿色(原始图像大部分为绿色)。 – 2010-06-16 14:17:18