System.Drawing.Common.Bitmap 跨平台的替代方案

本文介绍了SkiaSharp,一个用于多种平台的2D图形库,展示了如何在C#中使用它进行图形渲染、绘制操作,包括位图处理、从System.Drawing转换以及绘制矩形的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        使用SkiaSharp,SkiaSharp 是一个跨平台的2D图形库,通过它可以在多种平台上进行图形渲染和绘制操作。它是对Google Skia图形库的C#.NET封装,提供了一套易于使用的API,可以用于创建图像、绘制文本、进行图形变换等操作。

        SkiaSharp 可以在多种平台上使用,包括 Windows、Linux、macOS、iOS、Android 和 Web。它适用于各种类型的应用程序,包括移动应用、桌面应用、游戏开发、图像编辑器等。        

例如需要Linux版,则安装第一个和第四个:

以下是使用SkiaSharp创建位图的示例代码:

// 创建位图

using (var surface = SKSurface.Create(new SKImageInfo(width, height)))

{

    // 获取画布

    var canvas = surface.Canvas;

    // 绘制位图内容

    canvas.DrawRect(new SKRect(0, 0, width, height), new SKPaint() { Color = SKColors.White });

    canvas.DrawText("Hello, SkiaSharp!", new SKPoint(20, 50), new SKPaint() { Color = SKColors.Black });

    // 将位图转换为字节数组

    var image = surface.Snapshot();

    var data = image.Encode().ToArray();

    // 加载到内存流中或保存到文件中

}

        以上示例创建了一个空白的位图,并在其中绘制文本。你可以使用其他SKCanvas的绘制方法,如画线、绘制形状等。

        当然,如果你已经有一个System.Drawing.Bitmap对象并且想要将它转换为SkiaSharp位图,你可以使用以下代码:

using (var stream = new MemoryStream())

{

    // 将System.Drawing.Bitmap转换为SkiaSharp位图

    bitmap.Save(stream, ImageFormat.Png);

    stream.Position = 0;

    var codec = SKCodec.Create(stream);

    // 创建位图并从流中解码

    using (var surface = SKSurface.Create(new SKImageInfo(codec.Info.Width, codec.Info.Height)))

    {

        var canvas = surface.Canvas;

        canvas.DrawBitmap(SKBitmap.Decode(codec), new SKRect(0, 0, codec.Info.Width, codec.Info.Height));

        var image = surface.Snapshot();

        var data = image.Encode().ToArray();

        // 加载到内存流中或保存到文件中

    }

}

        在这个示例中,我们将System.Drawing.Bitmap对象保存到内存流中,然后使用SKBitmap转换。

演示如何使用 SkiaSharp 在屏幕上绘制一个矩形:

using SkiaSharp;

class Program
{
    static void Main(string[] args)
    {
        // 创建画布
        using (var surface = SKSurface.Create(new SKImageInfo(640, 480)))
        {
            // 获取画布的绘图上下文
            var canvas = surface.Canvas;

            // 清空画布
            canvas.Clear(SKColors.White);

            // 创建画笔
            using (var paint = new SKPaint())
            {
                // 设置画笔颜色和样式
                paint.Color = SKColors.Blue;
                paint.Style = SKPaintStyle.Fill;

                // 绘制矩形
                canvas.DrawRect(new SKRect(100, 100, 200, 200), paint);
            }

            // 将图像保存到文件
            using (var image = surface.Snapshot())
            using (var data = image.Encode(SKEncodedImageFormat.Png, 100))
            using (var stream = System.IO.File.Create("rectangle.png"))
            {
                data.SaveTo(stream);
            }
        }
    }
}
        在这个例子中,我们创建了一个 640x480 的画布,并通过 `SKSurface` 的静态 `Create` 方法创建了一个用于绘图的表面。然后,我们通过 `SKSurface` 获取了绘图的 `canvas` 对象,可以利用它来进行各种绘图操作。

        我们使用 `SKPaint` 来创建一个画笔,指定了颜色和样式。然后,我们使用 `canvas.DrawRect` 方法绘制了一个矩形,指定了位置和尺寸。

        最后,我们使用 `surface.Snapshot` 将画布中的内容保存为一个图像,并使用 `image.Encode` 将图像编码为 PNG 格式。最后,我们将编码后的图像保存到文件中。

        这只是一个简单的例子,你可以根据需求使用 SkiaSharp 进行更复杂的图形绘制和操作。可以通过 NuGet 包管理器获取 SkiaSharp 库。

### 将 `System.Drawing.Bitmap` 转换为 `ZXing.BinaryBitmap` 在 C# 中,可以利用 ZXing.Net 库来完成将 `System.Drawing.Bitmap` 转换为 `ZXing.BinaryBitmap` 的操作。以下是具体的实现方式: #### 实现步骤 1. **加载 Bitmap 图像** 首先需要确保已经成功加载了一个有效的 `System.Drawing.Bitmap` 对象。 2. **使用 LuminanceSource 和 RGBLuminanceSource** ZXing 提供了 `RGBLuminanceSource` 类用于解析图像像素数据,并将其转换为二值化形式。 3. **创建 BinaryBitmap** 利用 `HybridBinarizer` 或其他 Binarizer 来生成最终的 `BinaryBitmap` 对象。 下面是完整的代码示例: ```csharp using System; using System.Drawing; using ZXing; public class BitmapToBinaryBitmapConverter { public static BinaryBitmap Convert(Bitmap bitmap) { if (bitmap == null) throw new ArgumentNullException(nameof(bitmap)); int width = bitmap.Width; int height = bitmap.Height; // 获取位图的原始像素数据 var pixels = new byte[width * height]; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { Color pixelColor = bitmap.GetPixel(x, y); int grayValue = (int)(pixelColor.R * 0.299 + pixelColor.G * 0.587 + pixelColor.B * 0.114); // 计算灰度值 pixels[y * width + x] = (byte)grayValue; } } // 创建 RGBLuminanceSource 并初始化 HybridBinarizer var source = new RGBLuminanceSource(pixels, width, height); var binarizer = new ZXing.Common.HybridBinarizer(source); // 返回 BinaryBitmap return new BinaryBitmap(binarizer); } } ``` 上述代码通过遍历 `Bitmap` 像素并计算其灰度值,构建了一个适合 ZXing 处理的 `BinaryBitmap` 对象[^1]。 --- #### 解决可能的依赖问题 如果在项目中遇到了类似于引用缺失的问题(如 CS1069 错误),可以通过以下方法解决: 1. 添加对 `System.Drawing.Common` 的 NuGet 包引用: 执行命令: ```bash dotnet add package System.Drawing.Common ``` 2. 如果是在跨平台环境中运行,则需注意某些操作系统不支持 GDI+ 功能。此时可考虑使用 SkiaSharp 替代传统绘图功能[^3]。 --- #### 注意事项 - 上述代码适用于 .NET Framework 及 .NET Core 环境下的桌面应用程序开发。 - 若目标环境为无头服务器或移动设备,请优先评估是否能完全替换掉 `System.Drawing.Bitmap`,改用更轻量级的库(例如 SkiaSharp)[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

csdn_aspnet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值