public CreateImage ( System.Windows.Media.Imaging.WriteableBitmap target, |
||
target | System.Windows.Media.Imaging.WriteableBitmap | |
pointer | ||
return | void |
public unsafe void CreateImage(WriteableBitmap target, IntPtr pointer)
{
Int32Rect rectangle = default(Int32Rect);
target.Dispatcher.Invoke(new Action(() =>
{
rectangle = new Int32Rect(0, 0, target.PixelWidth, target.PixelHeight);
}));
byte* pImage = (byte*)pointer.ToPointer();
var pixelCount = rectangle.Width * rectangle.Height;
var buffer = new byte[pixelCount * 3];
for (int index = 0; index < pixelCount; index++)
{
buffer[index * 3] = pImage[2];
buffer[index * 3 + 1] = pImage[1];
buffer[index * 3 + 2] = pImage[0];
pImage += 3;
}
target.Dispatcher.Invoke(new Action(() =>
{
target.Lock();
target.WritePixels(rectangle, buffer, rectangle.Width * 3, 0);
target.Unlock();
}));
}
}
public void Can_Create_Color_Image() { var imageFactory = new RgbImageSourceFactory(); var pointerFactory = new ArrayToPointerFactory(); var data = new ushort[20 * 10 * 2]; for (int index = data.Length / 2; index < data.Length; index++) { data[index] = ushort.MaxValue; } var bitmap = new WriteableBitmap(20, 10, 96, 96, PixelFormats.Bgr24, null); var pointer = pointerFactory.CreatePointer(data); try { imageFactory.CreateImage(bitmap, pointer); } finally { pointerFactory.Destroy(pointer); } int height = bitmap.PixelHeight; int width = bitmap.PixelWidth; int stride = bitmap.PixelWidth * 3; byte[] pixelByteArray = new byte[bitmap.PixelHeight * stride]; bitmap.CopyPixels(pixelByteArray, stride, 0); Assert.AreEqual(0, pixelByteArray[0]); Assert.AreEqual(0, pixelByteArray[1]); Assert.AreEqual(0, pixelByteArray[2]); Assert.AreEqual(255, pixelByteArray[10 * 3 + 9 * stride]); Assert.AreEqual(255, pixelByteArray[10 * 3 + 9 * stride + 1]); Assert.AreEqual(255, pixelByteArray[10 * 3 + 9 * stride + 2]); }