Во-первых, вы должны использовать WritableBitmap
, чтобы получить коллекцию пикселей: WriteableBitmap bmp = new WriteableBitmap(bitmapImageObj);
. Каждый пиксель представлен как 32-битное целое число. Я создал структуру, которая просто помогает разделить целое число на четыре байта (ARGB).
struct BitmapPixel
{
public byte A;
public byte R;
public byte G;
public byte B;
public BitmapPixel(int pixel)
: this(BitConverter.GetBytes(pixel))
{
}
public BitmapPixel(byte[] pixel)
: this(pixel[3], pixel[2], pixel[1], pixel[0])
{
}
public BitmapPixel(byte a, byte r, byte g, byte b)
{
this.A = a;
this.R = r;
this.G = g;
this.B = b;
}
public int ToInt32()
{
byte[] pixel = new byte[4] { this.B, this.G, this.R, this.A };
return BitConverter.ToInt32(pixel, 0);
}
}
Вот пример того, как оно может быть использовано для изменения значения красного:
BitmapPixel pixel = new BitmapPixel(bmp.Pixels[0]);
pixel.R = 255;
bmp.Pixels[0] = pixel.ToInt32();
Кроме того, я хотел бы отметить, что WriteableBitmap.Pixels в формате RGB умножается. This статья объяснит, что это значит. А вот как компенсация осуществляется с помощью BitmapPixel структуры:
public static void CompensateRGB(int[] pixels)
{
for (int i = 0; i < pixels.Length; i++)
{
BitmapPixel pixel = new BitmapPixel(pixels[i]);
if (pixel.A == 255 || pixel.A == 0)
continue;
if (pixel.R == 0 && pixel.G == 0 && pixel.B == 0)
{
// color is unrecoverable, get rid of this
// pixel by making it transparent
pixel.A = 0;
}
else
{
double factor = 255.0/pixel.A;
pixel.A = 255;
pixel.R = (byte)(pixel.R * factor);
pixel.G = (byte)(pixel.G * factor);
pixel.B = (byte)(pixel.B * factor);
}
pixels[i] = pixel.ToInt32();
}
}
http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.bitmapimage_methods.aspx Он находится на MSDN , но да, похоже, он не доступен в Silverlight. – Rafe
Ссылка, предоставленная вами для .NET 3.5, а не Silverlight. Документацию MSDN для класса Silverlight BitmapImage можно найти здесь: http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.bitmapimage(VS.96).aspx – markti