SkiaSharp库在NetCore下跨平台图片操作基础使用方法

SkiaSharp库在NetCore下跨平台图片操作基础使用方法:

在跨平台开发中,处理图片是一项常见的需求。而SkiaSharp库是一个强大的工具,它提供了在NetCore平台下进行跨平台图片操作的能力。本文将介绍SkiaSharp库在NetCore下的基础使用方法,以及逐步深入的高级功能。

什么是SkiaSharp?

SkiaSharp是一个跨平台的2D图形库,它提供了强大的绘图和图片处理能力。它基于Google的Skia图形库,并使用C#语言进行封装,支持在多个平台上进行图形渲染和图片操作。在NetCore平台下,我们可以利用SkiaSharp库来进行跨平台图片操作,包括格式转换、剪裁、水印、缩放等高级功能。

安装SkiaSharp库

在开始之前,我们首先需要安装SkiaSharp库。在NetCore项目中,我们可以通过NuGet包管理器来安装SkiaSharp库。在您的项目中,执行以下命令来安装SkiaSharp库:

dotnet add package SkiaSharp

安装完成后,我们就可以开始使用SkiaSharp库来进行跨平台图片操作了。

格式转换

图片格式转换是一项常见的操作,它允许我们将图片从一种格式转换为另一种格式。SkiaSharp库提供了用于格式转换的函数,我们可以通过以下代码来将一张图片从JPEG格式转换为PNG格式:

using SkiaSharp;

class Program
{
    static void Main()
    {
        // 加载JPEG图片
        using (var bitmap = SKBitmap.Decode("input.jpg"))
        {
            // 将图片转换为PNG格式
            using (var convertedBitmap = bitmap.Copy(SKBitmapConfig.RGBA8888))
            {
                convertedBitmap.Save("converted.png", SKEncodedImageFormat.Png);
            }
        }
    }
}

在上述代码中,我们首先加载了一张JPEG格式的图片。然后,通过调用Copy函数并指定目标格式,我们将图片从JPEG格式转换为RGBA8888格式。最后,使用Save函数将转换后的图片保存为PNG格式。

图片剪裁

图片剪裁是一种常用的操作,它允许我们从原始图片中提取出感兴趣的区域。SkiaSharp库提供了用于剪裁的函数,我们可以通过以下代码来剪裁图片:

using SkiaSharp;

class Program
{
    static void Main()
    {
        // 加载图片
        using (var bitmap = SKBitmap.Decode("input.jpg"))
        {
            // 定义剪裁区域
            var cropRect = new SKRectI(100, 100, 300, 300);

            // 剪裁图片
            using (var croppedBitmap = new SKBitmap(cropRect.Width, cropRect.Height))
            {
                bitmap.ExtractSubset(croppedBitmap, cropRect);
                croppedBitmap.Save("cropped.png", SKEncodedImageFormat.Png);
            }
        }
    }
}

在上述代码中,我们首先加载一张图片。然后,通过定义一个剪裁区域,我们指定了要提取的感兴趣区域的位置和大小。接下来,我们创建一个新的位图对象来存储剪裁后的图片,并使用ExtractSubset函数将剪裁后的图片提取出来。最后,使用Save函数将剪裁后的图片保存为PNG格式。

图片加水印

图片加水印是一种常见的操作,它允许我们在图片上添加自定义的文字或图标。SkiaSharp库提供了绘制函数来实现图片加水印的功能。以下是一个示例代码,演示了如何在一张图片上添加水印:

using SkiaSharp;

class Program
{
    static void Main()
    {
        // 加载图片
        using (var bitmap = SKBitmap.Decode("input.jpg"))
        {
            // 加载水印图片
            using (var watermark = SKBitmap.Decode("watermark.png"))
            {
                // 定义水印位置和大小
                var watermarkRect = new SKRectI(0, 0, 100, 50);

                // 创建绘图表面
                using (var surface = SKSurface.Create(new SKImageInfo(bitmap.Width, bitmap.Height)))
                {
                    var canvas = surface.Canvas;

                    // 绘制原始图片
                    canvas.DrawBitmap(bitmap, 0, 0);

                    // 绘制水印
                    canvas.DrawBitmap(watermark, watermarkRect.Left, watermarkRect.Bottom - watermark.Height);

                    // 保存带有水印的图片
                    using (var outputBitmap = surface.Snapshot())
                    {
                        outputBitmap.Save("watermarked.png", SKEncodedImageFormat.Png);
                    }
                }
            }
        }
    }
}

在上面的代码中,我们首先加载一张图片和一个水印图片。然后,我们定义了水印的位置和大小。接下来,我们创建一个绘图表面,并使用DrawBitmap函数在表面上绘制原始图片和水印。最后,使用Save函数将带有水印的图片保存为PNG格式。

图片缩放

图片缩放是一项常见的操作,它允许我们调整图片的大小。SkiaSharp库提供了用于缩放的函数,以下是一个示例代码,演示了如何对一张图片进行缩放:

using SkiaSharp;

class Program
{
    static void Main()
    {
        // 加载图片
        using (var bitmap = SKBitmap.Decode("input.jpg"))
        {
            // 缩放图片
            var scaledBitmap = bitmap.Resize(new SKSizeI(500, 300), SKFilterQuality.High);
            scaledBitmap.Save("scaled.png", SKEncodedImageFormat.Png);
        }
    }
}

在上述代码中,我们首先加载一张图片。然后,通过调用Resize函数并指定目标大小和滤波器质量,我们将图片缩放为指定的大小。最后,使用Save函数将缩放后的图片保存为PNG格式。

如果你要按照高度来进行等比缩放,可以根据以下步骤使用SkiaSharp库进行操作:

  1. 导入SkiaSharp命名空间:
using SkiaSharp;
  1. 加载原始图像:
string filePath = "path/to/image.png"; // 图像文件的路径

// 使用SKBitmap加载原始图像
SKBitmap originalBitmap = SKBitmap.Decode(filePath);
  1. 计算缩放后的目标尺寸:
int targetHeight = 600; // 目标高度

// 计算缩放后的目标宽度,保持纵横比
float aspectRatio = (float)originalBitmap.Height / originalBitmap.Width;
int targetWidth = (int)(targetHeight / aspectRatio);

// 创建缩放后的目标尺寸
SKSizeI targetSize = new SKSizeI(targetWidth, targetHeight);
  1. 创建缩放后的图像:
// 创建缩放后的SKBitmap对象
SKBitmap scaledBitmap = new SKBitmap(targetSize.Width, targetSize.Height);

// 使用SKCanvas将原始图像绘制到缩放后的图像上
using (SKCanvas canvas = new SKCanvas(scaledBitmap))
{
    // 使用SKPaint进行绘制设置,如保持纵横比、插值质量等
    using (SKPaint paint = new SKPaint())
    {
        // 设置插值质量为高质量
        paint.FilterQuality = SKFilterQuality.High;

        // 计算绘制的矩形区域,保持纵横比
        float scaledWidth = targetHeight / aspectRatio;
        float scaledHeight = targetHeight;
        float x = (targetSize.Width - scaledWidth) / 2;
        float y = 0;
        SKRect destRect = SKRect.Create(x, y, scaledWidth, scaledHeight);

        // 绘制原始图像到缩放后的图像上
        canvas.DrawBitmap(originalBitmap, destRect, paint);
    }
}

现在,scaledBitmap就是按照高度为准,自动调整宽度进行等比例缩放后的图像。你可以根据需要进行进一步的操作,如保存到文件或显示在界面上。

请注意,上述代码假设原始图像的高度大于0,以避免除以零的错误。在实际应用中,你可能还需要添加适当的错误处理和边界条件检查。

性能方面的建议

在进行跨平台图片操作时,我们也需要注意性能方面的考虑。以下提供一些建议,以帮助改进性能:

  1. 尽可能使用异步操作:在进行耗时的图片处理操作时,考虑使用异步方式,以避免阻塞主线程。

  2. 使用适当的编码格式和压缩参数:根据图片的用途,选择适当的编码格式和压缩参数,以减小图片文件的体积。

  3. 考虑图片缓存:如果我们需要多次对同一张图片进行处理,可以考虑使用缓存来避免重复加载和处理。

以上是关于SkiaSharp库在NetCore平台下进行跨平台图片操作的基础使用方法和性能方面的建议。通过SkiaSharp库,我们可以轻松地处理图片,并实现各种高级功能。希望本文对您有所帮助,如有任何疑问或需要进一步的帮助,请随时留言。

posted @ 2023-11-26 22:03  pccai  阅读(3376)  评论(1编辑  收藏  举报