惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
Check Point Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 聂微东
月光博客
月光博客
博客园 - 司徒正美
爱范儿
爱范儿
aimingoo的专栏
aimingoo的专栏
量子位
Recent Announcements
Recent Announcements
V
V2EX
P
Proofpoint News Feed
小众软件
小众软件
云风的 BLOG
云风的 BLOG
腾讯CDC
宝玉的分享
宝玉的分享
Microsoft Azure Blog
Microsoft Azure Blog
大猫的无限游戏
大猫的无限游戏
Vercel News
Vercel News
The GitHub Blog
The GitHub Blog
A
About on SuperTechFans
B
Blog
博客园_首页
GbyAI
GbyAI
博客园 - Franky

博客园 - pccai

Matlab R2023b全家桶docker镜像下载 在Docker中安装GaussDB的ODBC驱动并添加Python测试代码 在Docker中安装PostgreSQL的ODBC驱动并添加Python测试代码 在Docker中安装MySQL的ODBC驱动并添加Python测试代码 在Docker中安装SQL Server的ODBC驱动并添加Python测试代码 Microsoft.AspNetCore.SignalR.Client中传送用户Token U8二次开发-钉钉集成 U8二次开发CO-基于Net8调用COM对象 Net7升级到Net8相关问题 .NET Core MemoryCache缓存批量获取Key或者删除 .NET中反射和动态表达式的分析和比较 NLog整合ExceptionLess如何映射当前用户身份 SkiaSharp库在NetCore下跨平台图片操作基础使用方法 VS2022下nuget包同步失败,提示: PackageSourceMapping 已启用,未考虑以下源: ** SonarQube-7.7到9.9社区版本默认数据库H2连接方法 使用 pip 出现 Script file ‘C:\Anaconda3\Scripts\pip-script.py‘ is not present 错误解决办法 - pccai 让简易流行的FRP支持Nginx转发SSE“打字效果” 使用LxRunOffline迁移Windows10启用的WSL默认虚拟磁盘位置 MAUI开发迁移AVD默认位置释放C盘空间
NetCore使用SkiaSharp库对给定路径的图片进行大小缩放,要适...
pccai · 2023-11-26 · via 博客园 - pccai

SkiaSharp库是跨平台的2D图片操作库,在夸平台方面比较稳定,且支持常用的“windows操作”:缩放,剪裁,格式转换等。

例如:如果要按照原始图片高度为准,自动调整宽度进行等比例缩放,可以根据以下步骤使用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,以避免除以零的错误。在实际应用中,你可能还需要添加适当的错误处理和边界条件检查。

扩展

要将缩放后的图像保存到磁盘或返回文件流,你可以使用SkiaSharp的功能来实现。下面是分别保存到磁盘和返回文件流的示例代码:

保存到磁盘:

string filePath = "path/to/image.png"; // 保存图像的文件路径

// 保存缩放后的图像到磁盘
using (var outputStream = File.OpenWrite(filePath))
{
    // 将SKBitmap编码为PNG格式并保存到输出流
    scaledBitmap.Encode(SKEncodedImageFormat.Png, 100).SaveTo(outputStream);
}

返回文件流:

// 创建一个MemoryStream来保存图像数据
using (var memoryStream = new MemoryStream())
{
    // 将SKBitmap编码为PNG格式并保存到内存流
    scaledBitmap.Encode(SKEncodedImageFormat.Png, 100).SaveTo(memoryStream);

    // 将内存流的位置重置为起始位置
    memoryStream.Seek(0, SeekOrigin.Begin);

    // 现在你可以使用memoryStream进行进一步的操作,如传输到客户端或保存到数据库等
    // 返回memoryStream或执行其他操作
}

以上代码示例假设你已经完成了缩放操作并获得了scaledBitmap对象。根据需要,你可以调整保存的图像格式(这里使用PNG格式)和压缩质量(这里使用100表示无损压缩)。

提示

在SkiaSharp库中,可以使用以下方法在SKImageSKBitmap对象之间进行相互转换:

  1. SKImageSKBitmap的转换:
SKImage skImage = ...; // 要转换的SKImage对象

// 创建一个空的SKBitmap对象
SKBitmap skBitmap = new SKBitmap(skImage.Width, skImage.Height);

// 将SKImage绘制到SKBitmap上
using (SKCanvas canvas = new SKCanvas(skBitmap))
{
    canvas.Clear(SKColors.Transparent);
    canvas.DrawImage(skImage, SKPoint.Empty);
}
  1. SKBitmapSKImage的转换:
SKBitmap skBitmap = ...; // 要转换的SKBitmap对象

// 将SKBitmap转换为SKImage
SKImage skImage = SKImage.FromBitmap(skBitmap);

请注意,这些转换可能会导致内存和性能方面的开销,特别是在处理大尺寸的图像时。确保在使用完对象后及时释放资源(比如默认都使用using),以避免内存泄漏。