如何使仅支持Windows的Bitmap转字节数组代码跨平台运行?
跨平台替代方案
原代码依赖的System.Drawing.Bitmap和ImageFormat属于System.Drawing.Common库,在.NET 6及以上版本中,该库已不再官方支持非Windows平台(强制启用需设置环境变量,但不推荐生产环境使用)。要实现跨平台的图像转字节数组功能,推荐使用专门的跨平台图像处理库,以下是两种可行方案:
方案一:使用ImageSharp
ImageSharp是一款高性能、跨平台的.NET图像处理库,完全无系统依赖。
- 安装NuGet包:
Install-Package SixLabors.ImageSharp
- 替换后的代码:
using SixLabors.ImageSharp; using SixLabors.ImageSharp.Formats.Png; using SixLabors.ImageSharp.PixelFormats; using System.IO; private static byte[] ImageToBytesCode(Image<Rgba32> image) { using (MemoryStream stream = new MemoryStream()) { image.Save(stream, new PngEncoder()); return stream.ToArray(); } }
如果你的代码仍需要兼容原有的System.Drawing.Bitmap对象,可以通过流转换:
// 将System.Drawing.Bitmap转为ImageSharp的Image using var bitmapStream = new MemoryStream(); originalBitmap.Save(bitmapStream, System.Drawing.Imaging.ImageFormat.Png); bitmapStream.Position = 0; using var imageSharpImage = Image.Load<Rgba32>(bitmapStream); // 调用上面的转换方法 var bytes = ImageToBytesCode(imageSharpImage);
方案二:使用SkiaSharp
SkiaSharp是Google Skia图形库的.NET绑定,同样是跨平台的图像处理方案。
- 安装NuGet包:
Install-Package SkiaSharp
- 替换后的代码:
using SkiaSharp; using System.IO; private static byte[] BitmapToBytesCode(SKBitmap bitmap) { using (MemoryStream stream = new MemoryStream()) using (SKImage image = SKImage.FromBitmap(bitmap)) using (SKData data = image.Encode(SKEncodedImageFormat.Png, 100)) { data.SaveTo(stream); return stream.ToArray(); } }
若要从System.Drawing.Bitmap转换为SKBitmap,可参考如下方式:
using var bitmapStream = new MemoryStream(); originalBitmap.Save(bitmapStream, System.Drawing.Imaging.ImageFormat.Png); bitmapStream.Position = 0; using var skBitmap = SKBitmap.Decode(bitmapStream); // 调用转换方法 var bytes = BitmapToBytesCode(skBitmap);
内容的提问来源于stack exchange,提问作者Furqat Abduvosiqov
相关产品推荐
相关产品推荐

