我有一些用C#編寫的小型WinForms應用程序,它們利用System.Drawing.Bitmap
和System.Windows.Forms.PictureBox
來顯示應用程序隨時間保留的原始字節緩衝區的位圖。在某種程度上,這類似於窮人的動畫。WPF中的位圖繪製
我想端口這些應用程序WPF,但有一個在字節的緩衝區寫,我不願意改變了很多定製邏輯的。谷歌搜索後,我嘗試使用System.Windows.Media.Imaging.WriteableBitmap
類,但無法使其工作。這個課程應該如何使用,並且符合我的原創設計?
下面是從原始的WinForms應用程序,累計上一個位圖寫入隨機顏色爲隨機位置的一個片段:
private void Form1_Load(object sender, EventArgs e)
{
_timer.Tick += new EventHandler(Timer_Tick);
_timer.Interval = 25;
_timer.Enabled = true;
}
private void Timer_Tick(object sender, EventArgs e)
{
Animate();
}
private void Animate()
{
Bitmap bitmap = (Bitmap)pictureBox1.Image;
if (bitmap != null)
{
bitmap.Dispose();
}
bitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);
var data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
if (_buffer == null)
{
_buffer = new byte[data.Stride * bitmap.Height];
}
for (int i = 0; i < 1000; i++)
{
var x = _random.Next(bitmap.Width);
var y = _random.Next(bitmap.Height);
var red = (byte)_random.Next(byte.MaxValue);
var green = (byte)_random.Next(byte.MaxValue);
var blue = (byte)_random.Next(byte.MaxValue);
var alpha = (byte)_random.Next(byte.MaxValue);
_buffer[y * data.Stride + x * 4] = blue;
_buffer[y * data.Stride + x * 4 + 1] = green;
_buffer[y * data.Stride + x * 4 + 2] = red;
_buffer[y * data.Stride + x * 4 + 3] = alpha;
}
Marshal.Copy(_buffer, 0, data.Scan0, _buffer.Length);
bitmap.UnlockBits(data);
pictureBox1.Image = bitmap;
}
使用(有據可查)[' BitmapSource.Create'](https://msdn.microsoft.com/en-us/library/ms616045(v = vs.110).aspx)方法。將BitmapSource分配給['Image']的'Source'屬性(https://msdn.microsoft.com/en-us/library/system.windows.controls.image(v = vs.110).aspx)控制。 – Clemens
我打算髮佈一個關於如何使用'WriteableBitmap'完成這個問題的答案,但問題已經關閉。 FWIW,我把它放在這裏:http://pastebin.com/Ufmx4giD –
謝謝你,@Clemens。你的簡潔的回答幫助我找到了自己的腳。 – Jono