首页 > 解决方案 > 如何在 WriteableBitmap 上写文本?

问题描述

现在我正在编写一个游戏,我需要在 WriteableBitmap 上绘制文本;如何在不从 WritableBitmap 转换为 Bitmap 再到 WriteableBitmap 的情况下做到这一点?我已经在寻找解决方案,但它们都会减慢我的游戏速度,或者需要 Silverlight 之类的东西才能工作。

像这样的东西:

public class ResourceCounter : UIElement
{

    public ResourceCounter()
    {
        RenderBounds = new Bound(new Point(0, 0),
                                 new Point(600, 30));
    }

    private string goldAmt;
    private string woodAmt;
    private string stoneAmt;

    public override void Tick()
    {
        goldAmt = GlobalResources.Gold.ToString();
        woodAmt = GlobalResources.Wood.ToString();
        stoneAmt = GlobalResources.Stone.ToString();
    }

    public override void Draw(WriteableBitmap bitmap)
    {
        bitmap.FillRectangle(RenderBounds.A.X,
        Renderbounds.A.Y,
        Renderbounds.B.X,
        Renderbounds.B.Y,
        Colors.DarkSlateGray);
        bitmap.DrawString("text", other parameters...");
    }

}

标签: c#wpfwriteablebitmapwriteablebitmapex

解决方案


您可以在 Bitmap 和 BitmapSource 之间共享像素缓冲区

var writeableBm1 = new WriteableBitmap(200, 100, 96, 96, 
    System.Windows.Media.PixelFormats.Bgr24, null);

var w = writeableBm1.PixelWidth;
var h = writeableBm1.PixelHeight;
var stride = writeableBm1.BackBufferStride;
var pixelPtr = writeableBm1.BackBuffer;

// this is fast, changes to one object pixels will now be mirrored to the other 
var bm2 = new System.Drawing.Bitmap(
    w, h, stride, System.Drawing.Imaging.PixelFormat.Format24bppRgb, pixelPtr);

writeableBm1.Lock();

// you might wanna use this in combination with Lock / Unlock, AddDirtyRect, Freeze
// before you write to the shared Ptr
using (var g = System.Drawing.Graphics.FromImage(bm2))
{
    g.DrawString("MyText", new Font("Tahoma", 14), System.Drawing.Brushes.White, 0, 0);
}

writeableBm1.AddDirtyRect(new Int32Rect(0, 0, 200, 100));
writeableBm1.Unlock();

推荐阅读