从System.Drawing.Bitmap区域创建WPF中的图像并调整其大小

时间:2011-02-08 15:37:43

标签: wpf bitmap resize render

我正在尝试实现一个带有System.Drawing.Bitmap对象并在WPF Canvas上呈现它的函数。在渲染之前,必须对位图进行裁剪和连接几次。

环境:在.NET 3.5 SP1上运行的WPF应用程序

输入:System.Drawing.Bitmap对象,大小为800x600,像素格式为RGB24

目标:显示由输入位图的两个条纹组成的图像(在一行上)。条纹是两个位图的一半 - (0,0,800,300)和(0,300,800,600)。后来我希望能够向上或向下缩放图像。

我已经用GDI和Graphics.DrawImage(渲染成Bitmap对象)实现了一个解决方案,但我希望提高性能(这个函数可以每秒调用30次)。

假设我想在WPF窗口上渲染图像,是否有更快的方法使用WPF实现此功能?

1 个答案:

答案 0 :(得分:0)

我到目前为止找到的最佳解决方案是使用WriteableBitmap,如下所示:

void Init()
{
    m_writeableBitmap = new WriteableBitmap(DesiredWidth, DesiredHeight, DesiredDpi, DesiredDpi, PixelFormats.Pbgra32, null);
{

void CopyPixels(System.Drawing.Bitmap frame, Rectangle source, Point destBegin)
{
    var bmpData = frame.LockBits(source, ImageLockMode.ReadOnly, frame.PixelFormat);
    m_writeableBitmap.Lock();

    var dest = new Int32Rect(destBegin.X, destBegin.Y, bmpData.Width, bmpData.Height);
    m_writeableBitmap.WritePixels(dest, bmpData.Scan0, bmpData.Stride * bmpData.Height, bmpData.Stride);

    m_writeableBitmap.Unlock();
    frame.UnlockBits(bmpData);
}

对于我在问题中描述的用例(两个条带),CopyPixels将被调用两次。