C# WriteableBitmap 转换成 Bitmap

这篇博客介绍了如何将Windows Phone中的WriteableBitmap对象转换为.NET Framework中的System.Drawing.Bitmap,以便于进行图片保存。主要步骤包括利用Bitmap的LockBits方法,结合unsafe代码块和Buffer.MemoryCopy进行数据复制,确保在不同平台间转换的兼容性。

查找了 许多网站,关于WriteableBitmap的资料很少,大部分也是关于用法的,但很少关于如何用它转换成常见的Bitmap格式。

使用以下的方式,可以将WriteableBitmap直接转换成System.Drawing.Bitmap,便于保存。

public static Bitmap WriteableBitmapToBitmap(WriteableBitmap wBitmap)
        {
            Bitmap bmp = new Bitmap(wBitmap.PixelWidth, wBitmap.PixelHeight);
            int rPixelBytes = wBitmap.BackBufferStride * wBitmap.PixelHeight;   //字节数,计算方式是幅宽乘以高度像素
            //注意,像素格式根据实际情况
            BitmapData data = bmp.LockBits(new System.Drawing.Rectangle(0, 0, wBitmap.PixelWidth, wBitmap.PixelHeight), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
            wBitmap.Lock();

            unsafe
            {
                Buffer.MemoryCopy(wBitmap.BackBuffer.ToPointer(), data.Scan0.ToPointer(), rPixelBytes, rPixelBytes);
            }
            //Buffer.MemoryCopy需要在.net 4.6版本或更高版本上才可以使用,.net4.5不存在该方法。
            wBitmap.AddDirtyRect(new Int32Rect(0, 0, (int)wBitmap.Width, (int)wBitmap.Height));
            wBitmap.Unlock();
            bmp.UnlockBits(data);
            return bmp;
        }

C# 中使用 `WriteableBitmap` 绘制文本并不是直接支持的功能,因为 `WriteableBitmap` 本身并不提供绘制文本的方法。然而,可以通过结合 `DrawingContext` 和 `DrawingVisual` 来实现这一功能。以下是一个完整的示例,展示如何使用 `WriteableBitmap` 结合 `RenderTargetBitmap` 和 `DrawingContext` 来绘制文本: ```csharp using System.Windows; using System.Windows.Media; using System.Windows.Media.Imaging; public class WriteableBitmapTextExample { public static WriteableBitmap DrawTextOnBitmap(string text, int width, int height) { // 创建一个 DrawingVisual 对象用于绘图 var visual = new DrawingVisual(); using (DrawingContext context = visual.RenderOpen()) { // 设置背景为白色 context.DrawRectangle(Brushes.White, null, new Rect(new Point(), new Size(width, height))); // 创建文本格式 FormattedText formattedText = new FormattedText( text, System.Globalization.CultureInfo.CurrentCulture, FlowDirection.LeftToRight, new Typeface("Arial"), 24, Brushes.Black ); // 在指定位置绘制文本 context.DrawText(formattedText, new Point(10, 10)); } // 创建 RenderTargetBitmap 并渲染 DrawingVisual var bitmap = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32); bitmap.Render(visual); // 将 RenderTargetBitmap 转换为 WriteableBitmap var writeableBitmap = new WriteableBitmap(bitmap); return writeableBitmap; } } ``` ### 使用说明 1. **创建 `DrawingVisual`**:通过 `DrawingVisual` 和 `DrawingContext` 可以执行绘图操作。 2. **绘制背景**:首先绘制一个背景矩形,确保图像有背景色。 3. **创建 `FormattedText`**:定义要绘制的文本内容、字体、大小和颜色。 4. **绘制文本**:使用 `DrawText` 方法将文本绘制到指定的位置。 5. **渲染到 `RenderTargetBitmap`**:将 `DrawingVisual` 渲染到 `RenderTargetBitmap`。 6. **转换为 `WriteableBitmap`**:最后将 `RenderTargetBitmap` 转换为 `WriteableBitmap`,以便进一步处理或显示。 ### 注意事项 - `WriteableBitmap` 本身不支持直接绘制文本,因此需要借助 `DrawingContext`。 - 文本的绘制依赖于 `FormattedText` 类,该类提供了丰富的文本格式化选项。 - 如果需要动态更新图像内容,可以将 `WriteableBitmap` 绑定到 UI 元素(如 `Image` 控件)并定期更新。 这个方法可以应用于 Silverlight 或 WPF 等基于 .NET 的 UI 框架中[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值