首页 > 其他分享 >NetCore使用SkiaSharp库对给定路径的图片进行大小缩放,要适当考虑等比率缩放,以高度为准,宽度自适应

NetCore使用SkiaSharp库对给定路径的图片进行大小缩放,要适当考虑等比率缩放,以高度为准,宽度自适应

时间:2023-11-26 21:55:17浏览次数:30  
标签:缩放 库对 NetCore SkiaSharp SKBitmap 图像 using SKImage

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),以避免内存泄漏。

标签:缩放,库对,NetCore,SkiaSharp,SKBitmap,图像,using,SKImage
From: https://www.cnblogs.com/pccai/p/17858040.html

相关文章

  • Arch Linux高分辨率屏幕设置分辨率及dpi缩放
    序言由于笔记本原生屏幕分辨率太渣,于是购入一块2440x1400、14英寸副屏。窗口管理器为dwm,使用startx命令进入环境注:此文不会改变tty的设置,仅设置xorg下某用户的个人设置目标实现:关闭笔记本屏幕,只使用副屏副屏分辨率设置为最高,且屏幕缩放设置为合适大小高分辨率小屏幕导致......
  • [MDP.NetCore] 使用Azure Portal,開發一個從GitHub持續佈署到Azure Container Apps的We
    使用AzurePortal,開發一個從GitHub持續佈署到AzureContainerApps的Web站台程式碼簽入GitHub之後,啟動GitHubAction流程,編譯並部署程式到AzureContainerApps,是開發系統時常見的功能需求。本篇範例協助開發人員使用GitHub與AzurePortal,逐步完成必要的設計和實作。範例下載:Sl......
  • Android 补间动画 -- 缩放
    文章目录1、简介2、代码架构3、activity_mani.xml文件4、scale.xml定义的动画属性文件5、MainActivity功能文件1、简介实现图片的放大缩小点击后缩小2、代码架构activity_main.xml文件定义了两个imageview还有一个按钮2)scale.xml是定义好的缩略动画属性3)ManiActivity......
  • netcore 同步方法里调异步,异步方法里调用同步,不死锁写法
     ///<summary>///同步方法里调用异步///</summary>staticvoidSyncMethod(){//同步方法中调用异步方法(第一种写法)AsyncMethod(参数1,参数2).ConfigureAwait(false).GetAwaiter().GetResult();//同步方法中调用异步方法(第二种写法)AsyncHelper.RunSync......
  • kde桌面不同分辨率的显示器设置不同缩放
    kde桌面不同分辨率的显示器设置不同缩放xrandr命令可以查看当前使用的显示器名称#!/bin/bash#你可以在kde设置里先把你的主显器分辨率缩放比例设置好。在运行下面的命令。并不会影响你设置里的分辨率。简单的讲下面的命令会按你设置里真是生成的分辨率去计算#设置eDP-1显示器......
  • 系统之缩放
    先看一张图在更改系统的百分比缩放的时候,我们的WPF程序书写好固定的宽高时,会因为这个的变化而变化。但是此时的宽高值是不变的。因此可以认为WPF中的元素的宽高值是和系统当前的DPI相关统一的。Windows使用此来让WPF随UI的变化而变化看似这个设计非常的好,而实际的情况是变大或......
  • IdentityServer4: 集成 AspNetCore Identity 框架
    IdentityServer4:集成AspNetCoreIdentity框架  目录IdentityServer4集成AspNetCoreIdentity框架新增依赖包集成AspNetIdentity代码迁移AspNetIdentity数据库生成用户信息修改IdentityServer.QuickstartUI代码登录退出使用IdentityUser用......
  • Android TextView自动缩放能够完整显示出一行
    原文地址:AndroidTextView自动缩放能够完整显示出一行-Stars-One的杂货小窝app开发中,需要TextView可以在不同的屏幕大小要完整显示出文字,而不是显示省略号可以使用以下代码,让TextView字体实现自适应(不过具体算法已经实现了,我们只需要设置下即可实现效果)//设置最大行......
  • Oracle、达梦:获取数据库对象、获取对象的DDL-数据定义语言
    一、获取据库对象(Oracle、达梦)ALL_OBJECTS表数据库所有对象表:包括表、视图、物化视图、函数……等--查询所有对象SELECT*fromALL_OBJECTS--筛选条件-OWENR:哪个数据库。-OBJECT_TYPE类型:SELECTOBJECT_NAME,OBJECT_TYPEfromALL_OBJECTSWHEREOWNER='M......
  • netcore 间隔时长修改参数 示例
    usingSystem;usingSystem.Threading.Tasks;classProgram{privatestaticintyourParameter=0;staticasyncTaskMain(){while(true){//等待5分钟awaitTask.Delay(TimeSpan.FromMinutes(5));//在这......