Как я могу использовать .NET ColorMatrix для изменения цвета? - PullRequest
4 голосов
/ 28 ноября 2010

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

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

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

Ответы [ 2 ]

3 голосов
/ 28 ноября 2010

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

1 голос
/ 28 ноября 2010

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