首页 > 其他分享 >SkiaSharp库在NetCore下跨平台图片操作基础使用方法

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

时间:2023-11-26 22:14:54浏览次数:43  
标签:缩放 SkiaSharp NetCore 跨平台 格式 var using 图片

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库,我们可以轻松地处理图片,并实现各种高级功能。希望本文对您有所帮助,如有任何疑问或需要进一步的帮助,请随时留言。

标签:缩放,SkiaSharp,NetCore,跨平台,格式,var,using,图片
From: https://www.cnblogs.com/pccai/p/17858065.html

相关文章

  • NetCore使用SkiaSharp库对给定路径的图片进行大小缩放,要适当考虑等比率缩放,以高度为准
    SkiaSharp库是跨平台的2D图片操作库,在夸平台方面比较稳定,且支持常用的“windows操作”:缩放,剪裁,格式转换等。例如:如果要按照原始图片高度为准,自动调整宽度进行等比例缩放,可以根据以下步骤使用SkiaSharp库进行操作:导入SkiaSharp命名空间:usingSkiaSharp;加载原始图像:str......
  • 一个基于.NET Core开源、跨平台的仓储管理系统
    前言今天给大家推荐一个基于.NETCore开源、跨平台的仓储管理系统,数据库支持MSSQL/MySQL:ZEQP.WMS。仓储管理系统介绍仓储管理系统(WarehouseManagementSystem,WMS)是一种用于管理和控制仓库操作的软件系统,它可以帮助企业实现对仓库内物品的跟踪、存储、拣选、包装和发运等全过程......
  • [MDP.NetCore] 使用Azure Portal,開發一個從GitHub持續佈署到Azure Container Apps的We
    使用AzurePortal,開發一個從GitHub持續佈署到AzureContainerApps的Web站台程式碼簽入GitHub之後,啟動GitHubAction流程,編譯並部署程式到AzureContainerApps,是開發系統時常見的功能需求。本篇範例協助開發人員使用GitHub與AzurePortal,逐步完成必要的設計和實作。範例下載:Sl......
  • Go语言开源跨平台GUI框架Fyne小教程|数据绑定篇
    入门数据绑定是在Fyne工具包v2.0.0版本中引入的的一个强大功能。通过使用数据绑定,我们可以避免手动管理许多标准对象,如标签、按钮和列表等,的数据内容。Fyne内置绑定支持许多基本数据类型(如Int、String、Float等),还有列表(如StringList、BoolList)以及Map和Struct绑定。这些类型中的每......
  • CPF C#跨平台UI框架开源了
    介绍C#跨平台UI框架提供NETStandard2.0和net4的库,通过Netcore可以跨平台,支持Windows、Mac、Linux,Net4的可以支持XP。各个平台运行效果一致,不依赖系统控件。支持窗体,控件任意透明,支持异形窗体,支持SVG图标显示。支持动画,数据绑定,Mvvm模式,CSS等,简化依赖属性,数据绑定的写法,提供数......
  • netcore 同步方法里调异步,异步方法里调用同步,不死锁写法
     ///<summary>///同步方法里调用异步///</summary>staticvoidSyncMethod(){//同步方法中调用异步方法(第一种写法)AsyncMethod(参数1,参数2).ConfigureAwait(false).GetAwaiter().GetResult();//同步方法中调用异步方法(第二种写法)AsyncHelper.RunSync......
  • IdentityServer4: 集成 AspNetCore Identity 框架
    IdentityServer4:集成AspNetCoreIdentity框架  目录IdentityServer4集成AspNetCoreIdentity框架新增依赖包集成AspNetIdentity代码迁移AspNetIdentity数据库生成用户信息修改IdentityServer.QuickstartUI代码登录退出使用IdentityUser用......
  • Avalonia 实现跨平台的IM即时通讯、语音视频通话(源码,支持信创国产OS,统信、银河麒麟)
       在Avalonia如火如荼的现在,之前使用CPF实现的简单IM,非常有必要基于Avalonia来实现了。Avalonia在跨平台上的表现非常出色,对信创国产操作系统(像银河麒麟、统信UOS、Deepin等)也很不错。   现在,我们就来使用Avalonia实现一个跨平台的简单IM,除了文字聊天外,还可......
  • netcore 间隔时长修改参数 示例
    usingSystem;usingSystem.Threading.Tasks;classProgram{privatestaticintyourParameter=0;staticasyncTaskMain(){while(true){//等待5分钟awaitTask.Delay(TimeSpan.FromMinutes(5));//在这......
  • Core 6.0 webapi ‘报错InvalidOperationException:无法解析“ Microsoft.AspNetCore.H
    因接口版本升级并使用core6.0却发现HttpContext.Current.Request用不了 所以在网上找了半天说是使用Microsoft.AspNetCore.Http.IHttpContextAccessorprivateIHttpContextAccessor_httpContextAccessor;publicWebHelper(IHttpContextAccessorhttpContextAccessor......