C# WriteableBitmap 转换成 Bitmap

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查找了 许多网站,关于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# WPF中,要计算Bitmap的直方图并将其显示到Image控件上,你可以按照以下步骤操作: 1. 首先,你需要获取Bitmap的数据。这通常通过`WriteableBitmap`类实现,因为它提供了一个像素级别的访问。 ```csharp using System.Windows.Media.Imaging; WriteableBitmap bitmap = new WriteableBitmap(bitmapSource); byte[] pixelData = new byte[bitmap.PixelWidth * bitmap.PixelHeight * 4]; bitmap.CopyPixels(pixelData, 0, pixelData.Length); ``` 这里,`bitmapSource`是一个`System.IO.Stream`类型的图像源,例如从文件、流或网络获取。 2. 对像素数据进行处理,计算直方图。这通常涉及到遍历像素,统计每个颜色通道(红、绿、蓝)的频率。你可以选择直接创建一个长度等于256的数组来记录每个灰度值的计数,因为通常将RGB转换为灰度值。 3. 创建一个新的Image控件,并设置其Source属性以显示直方图图片。为了显示直方图,你可以创建一个宽度高度适中的矩形区域,然后根据直方图数据填充颜色。 ```csharp var histogramImage = new Image(); histogramImage.Width = 256; histogramImage.Height = (int)Math.Ceiling(bitmap.PixelHeight / 8); // 简化显示,假设每个直方图条宽8像素 // 创建一个画布和笔刷,用于绘制直方图 DrawingContext context = histogramImage.RenderOpen(); SolidColorBrush brush = new SolidColorBrush(Colors.Gray); for (int i = 0; i < 256; i++) { int count = GetGrayLevelCount(i, pixelData); double height = (double)count / bitmap.PixelHeight; // 绘制直方图条 context.DrawLine(new Pen(brush, 1), new Point(i, histogramImage.Height - height), new Point(i, histogramImage.Height)); } context.Close(); histogramImage.Source = CreateHistogramImageSource(bitmapPixelData); ``` 这里的`GetGrayLevelCount`函数用于从像素数据中提取对应灰度级的像素数量。 4. 最后,你需要定义`CreateHistogramImageSource`函数,将直方图数据转换成合适的ImageSource。这可能涉及创建一个新的位图并填充相应颜色。 注意:这个过程可能会比较复杂,特别是如果你需要处理大量的图像数据。对于性能优化,考虑使用多线程或者异步处理,以及避免在UI线程中执行耗时操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值