Как я могу использовать.NET ColorMatrix для изменения цвета?

У меня есть изображение, которое я хотел бы установить пикселей на белый, если pixel(x,y).R < 165.

После этого я хотел бы установить черные все пиксели, которые не являются белыми.

Могу ли я сделать это с помощью ColorMatrix?

2 ответа

Вы не можете сделать это с помощью colormatrix. Цветовая матрица хороша для линейных преобразований из одного цвета в другой. То, что вам нужно, не является линейным.

Хороший способ сделать эти относительно простые манипуляции с изображениями - это получить непосредственно данные растрового изображения. Боб Пауэлл написал статью об этом на 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;
}
Другие вопросы по тегам