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