我如何使用.NET ColorMatrix来改变颜色?

时间:2010-11-28 09:07:15

标签: c# .net gdi+ colormatrix

如果像素(x,y),则我想要将像素设置为白色的图像.R< 165。

之后我想将所有不是白色的像素设置为黑色。

我可以使用ColorMatrix吗?

2 个答案:

答案 0 :(得分:3)

你不能用colormatrix做到这一点。彩色矩阵适用于从一种颜色到另一种颜色的线性变换。你需要的不是线性的。

答案 1 :(得分:1)

进行这些相对简单的图像处理的好方法是直接获取位图数据。鲍勃鲍威尔在http://www.bobpowell.net/lockingbits.htm写了一篇关于此的文章。它解释了如何锁定位图并通过Marshal类访问其数据。

在这些方面有一个结构是很好的:

[StructLayout(LayoutKind.Explicit)]
public struct Pixel
{
    // These fields provide access to the individual
    // components (A, R, G, and B), or the data as
    // a whole in the form of a 32-bit integer
    // (signed or unsigned). Raw fields are used
    // instead of properties for performance considerations.
    [FieldOffset(0)]
    public int Int32;
    [FieldOffset(0)]
    public uint UInt32;
    [FieldOffset(0)]
    public byte Blue;
    [FieldOffset(1)]
    public byte Green;
    [FieldOffset(2)]
    public byte Red;
    [FieldOffset(3)]
    public byte Alpha;


    // Converts this object to/from a System.Drawing.Color object.
    public Color Color {
        get {
            return Color.FromArgb(Int32);
        }
        set {
            Int32 = Color.ToArgb();
        }
    }
}

只需创建一个新的Pixel对象,您就可以通过Int32字段设置其数据,并回读/修改各个颜色组件。

Pixel p = new Pixel();
p.Int32 = pixelData[pixelIndex]; // index = x + y * stride
if(p.Red < 165) {
    p.Int32 = 0; // Reset pixel
    p.Alpha = 255; // Make opaque
    pixelData[pixelIndex] = p.Int32;
}