BitmapSource 和 Bitmap 之间有转换的好方法吗

swift

1个回答

写回答

Babala12

2025-07-09 22:28

+ 关注

BitmapSource 和 Bitmap 之间的转换方法

在开发中,经常会涉及到图像的处理和显示。.NET Framework提供了两个常用的类,即BitmapSource和Bitmap,用于处理和显示图像。BitmapSource是一个抽象类,表示可读取的位图图像,而Bitmap是一个具体类,表示位图图像的像素数据。由于BitmapSource和Bitmap之间的类型不同,因此在使用过程中需要进行相互之间的转换。

1. BitmapSource 转换为 Bitmap

要将BitmapSource转换为Bitmap,可以使用以下代码:

csharp

public static Bitmap BitmapSourceToBitmap(BitmapSource bitmapSource)

{

Bitmap bitmap;

using (MemoryStream stream = new MemoryStream())

{

BitmapEncoder encoder = new BmpBitmapEncoder();

encoder.Frames.Add(BitmapFrame.Create(bitmapSource));

encoder.Save(stream);

bitmap = new Bitmap(stream);

}

return bitmap;

}

在上述代码中,首先创建一个MemoryStream对象,用于保存位图数据。然后,创建一个BmpBitmapEncoder对象,并将BitmapSource添加到编码器的帧集合中。接下来,通过调用编码器的Save方法,将位图数据保存到MemoryStream中。最后,使用MemoryStream初始化Bitmap对象,并返回转换后的Bitmap。

2. Bitmap 转换为 BitmapSource

要将Bitmap转换为BitmapSource,可以使用以下代码:

csharp

public static BitmapSource BitmapToBitmapSource(Bitmap bitmap)

{

IntPtr hBitmap = bitmap.GetHbitmap();

BitmapSource bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());

// 释放GDI资源

NativeMethods.DeleteObject(hBitmap);

return bitmapSource;

}

private static class NativeMethods

{

[DllImport("gdi32.dll", SetLastError = true)]

public static extern bool DeleteObject(IntPtr hObject);

}

在上述代码中,首先通过调用Bitmap的GetHbitmap方法,获取位图的句柄。然后,使用Imaging类的CreateBitmapSourceFromHBitmap方法,将位图句柄转换为BitmapSource对象。最后,通过调用NativeMethods类中的DeleteObject方法释放GDI资源,并返回转换后的BitmapSource。

3. 示例代码

以下是一个示例代码,演示了如何在WPF应用程序中将BitmapSource和Bitmap之间进行转换:

csharp

private void ConvertBitmapSourceToBitmap()

{

// 从资源文件中加载BitmapSource

BitmapSource bitmapSource = (BitmapSource)Application.Current.FindResource("MyBitmapSource");

// 将BitmapSource转换为Bitmap

Bitmap bitmap = BitmapHelper.BitmapSourceToBitmap(bitmapSource);

// 在PictureBox中显示Bitmap

pictureBox.Image = bitmap;

}

private void ConvertBitmapToBitmapSource()

{

// 从文件中加载Bitmap

Bitmap bitmap = new Bitmap("path/to/image.jpg");

// 将Bitmap转换为BitmapSource

BitmapSource bitmapSource = BitmapHelper.BitmapToBitmapSource(bitmap);

// 在Image控件中显示BitmapSource

image.Source = bitmapSource;

}

在上述代码中,ConvertBitmapSourceToBitmap方法演示了如何将BitmapSource转换为Bitmap,并将转换后的Bitmap显示在PictureBox中。ConvertBitmapToBitmapSource方法演示了如何将Bitmap转换为BitmapSource,并将转换后的BitmapSource显示在Image控件中。

通过以上方法,我们可以在BitmapSource和Bitmap之间进行相互转换。这在图像处理和显示的开发中非常有用,可以帮助我们方便地在不同的场景中使用不同的图像类。使用上述的转换方法,我们可以轻松地在WPF应用程序中处理和显示图像。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号