.NET Framework项目移植.NET Core 2.0遇BitmapImage类问题求助
解决.NET Core 2.0中BitmapImage缺失的问题
我之前帮不少开发者处理过.NET Framework到.NET Core的移植问题,你遇到的BitmapImage困境确实挺典型的——毕竟.NET Core 2.0本身就没包含WPF相关的PresentationCore组件,也没有直接对应的NuGet包。给你几个可行的解决方案,你可以根据项目实际情况选择:
方案1:使用官方的System.Drawing.Common NuGet包
这是微软为.NET Core提供的替代传统System.Drawing的库,虽然不是WPF的BitmapImage,但能满足绝大多数图像加载、处理的需求。
- 第一步先安装NuGet包:在包管理器控制台执行
Install-Package System.Drawing.Common,或者在Visual Studio的NuGet管理器里搜索安装。 - 示例代码:
using System.Drawing; using System.Drawing.Imaging; using System.IO; // 加载本地图像文件 using (var bitmap = new Bitmap("example.jpg")) { // 示例:将图像缩放到200x200 var resizedBitmap = new Bitmap(bitmap, new Size(200, 200)); resizedBitmap.Save("resized_example.jpg", ImageFormat.Jpeg); // 如果需要将图像转换为流供其他组件使用 using (var stream = new MemoryStream()) { bitmap.Save(stream, ImageFormat.Png); stream.Position = 0; // 这里可以把stream传递给需要图像数据的模块 } }
注意:这个库在Windows平台表现完美,但在Linux或macOS上部署时,需要额外安装libgdiplus依赖包。
方案2:升级到更高版本的.NET Core/.NET
.NET Core 2.0是比较老旧的版本(早已停止官方支持),微软从.NET Core 3.0开始正式引入了WPF框架支持。升级后你可以直接复用原来的BitmapImage代码,几乎不需要修改:
- 把项目的目标框架升级到.NET Core 3.0/3.1(或者更推荐的.NET 5+ LTS版本,比如.NET 6/8)
- 升级完成后,直接引用
PresentationCore程序集,使用System.Windows.Media.Imaging.BitmapImage,和原代码完全兼容:
using System.Windows.Media.Imaging; using System; var bitmapImage = new BitmapImage(); bitmapImage.BeginInit(); bitmapImage.UriSource = new Uri("example.jpg", UriKind.Relative); bitmapImage.EndInit(); // 后续可以像原来一样使用bitmapImage对象
这应该是最省心的方案,不仅解决了BitmapImage的问题,还能让项目获得更高的性能、更多特性和安全补丁。
方案3:使用跨平台第三方图像处理库(ImageSharp)
如果你需要纯跨平台支持,且不想依赖系统级的图像库,SixLabors.ImageSharp是个非常优秀的选择——它是完全托管的跨平台图像处理库,无需额外依赖:
- 安装NuGet包:执行
Install-Package SixLabors.ImageSharp - 示例代码:
using SixLabors.ImageSharp; using SixLabors.ImageSharp.Formats.Jpeg; using SixLabors.ImageSharp.Processing; using System.IO; // 加载图像并进行处理 using (var image = Image.Load("example.jpg")) { // 示例:缩放图像并设置高质量保存 image.Mutate(x => x.Resize(200, 200)); image.Save("resized_example.jpg", new JpegEncoder { Quality = 90 }); // 转换为流供其他使用 using (var stream = new MemoryStream()) { image.Save(stream, new PngEncoder()); stream.Position = 0; // 这里可以使用stream传递图像数据 } }
这个库的API设计简洁友好,完全跨平台,适合现代.NET项目的需求。
内容的提问来源于stack exchange,提问作者Georgi Karavasilev
相关产品推荐
相关产品推荐

