C# 图像转换实战:Bitmap 转 BitmapSource 的 2 种方法

发布于:2025-07-28 ⋅ 阅读:(17) ⋅ 点赞:(0)


C# 图像转换实战:Bitmap 转 BitmapSource 的 2 种方法

引言

在 C# 开发中,当你同时使用 Windows Forms 和 WPF 框架时,是否曾遇到过这样的窘境:

  • “明明都是表示图像的数据类型,为什么 System.Drawing.Bitmap 不能直接赋值给 WPF 的 Image 控件?”
  • “转换图像后程序内存占用飙升,甚至出现莫名其妙的 GDI + 错误?”

这两个问题的根源在于:System.Drawing.Bitmap 属于GDI+(Windows Forms),而 BitmapSource 是WPF核心类型,两者基于不同渲染引擎,无法直接赋值。下面是适用于不同场景下的两种高效转换的方案,解决混合编程中的图像类型转换难题

两种转换方法的完整实现

1. 基于GDI句柄的直接转换 (ToBitmapSourceFast)

[DllImport("gdi32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool DeleteObject(IntPtr hObject);
public static BitmapSource ToBitmapSourceFast(this Bitmap bitmap)
{
   
   
    if (bitmap == null)  return null;
    IntPtr hBitmap = IntPtr.Zero;
    try
    {
   
   
        hBitmap = bitmap.GetHbitmap();   // 获取GDI句柄(非托管资源)
        return Imaging.CreateBitmapSourceFromHBitmap(
               hBitmap,
               IntPtr.Zero,
               System.Windows.Int32Rect.Empty,
               BitmapSizeOptions.FromEmptyOptions());   // 直接从GDI句柄创建BitmapSource
     }
     catch (Exception ex)
     {
   
   
           Console

网站公告

今日签到

点亮在社区的每一天
去签到