如何在 WriteableBitmap 上写入文本?
How do I write text on 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...");
}
}
您可以在 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();
现在我正在编写游戏代码,我需要将文本绘制到 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...");
}
}
您可以在 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();