Вы должны заблокировать как BitmapData
, так и WriteableBitmap
.Если вы хотите нарисовать изображение в определенном (x, y) месте, вам также следует управлять оставшейся шириной и высотой изображения для рисования.
[DllImport("kernel32.dll",EntryPoint ="RtlMoveMemory")]
public static extern void CopyMemory(IntPtr dest, IntPtr source,int Length);
public void DrawImage(Bitmap bitmap)
{
BitmapData data = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
try
{
writeableBitmap.Lock();
CopyMemory(writeableBitmap.BackBuffer, data.Scan0,
(writeableBitmap.BackBufferStride * bitmap.Height));
writeableBitmap.AddDirtyRect(new Int32Rect(0, 0, bitmap.Width, bitmap.Height));
writeableBitmap.Unlock();
}
finally
{
bitmap.UnlockBits(data);
bitmap.Dispose();
}
}
И в вашем коде:
Bitmap bitmap = new Bitmap("pic.jpg"); // obtain it from anywhere, memory, file, stream ,...
writeableBitmap = new WriteableBitmap(
bitmap.Width,
bitmap.Height,
96,
96,
PixelFormats.Pbgra32,
null);
imageBox.Source = writeableBitmap;
DrawImage(bitmap);
Мне удалось воспроизвести клип 1080P с 29 кадрами в секунду, используя этот метод.