当前位置: 首页 > news >正文

.NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法

        在.NET 6中,微软官方建议把 System.Drawing.Common 迁移到 SkiaSharp 库。因为System.Drawing.Common 被设计为 Window 技术的精简包装器,因此其跨平台实现欠佳。

        SkiaSharp是一个基于谷歌的Skia图形库(Skia.org)的用于.NET平台的跨平台2D图形API

        它提供了一个全面的2D API,可以跨移动、服务器和桌面模型来渲染图像。

        SkiaSharp提供跨平台绑定:.NET Standard 1.3、.NET Core、.NET 6、Tizen、Android、iOS、tvOS、watchOS、macOS、Mac Catalyst、WinUI 3 (Windows App SDK / Uno Platform)、Windows Classic Desktop (Windows.Forms / WPF)、Windows UWP (Desktop / Mobile / Xbox / HoloLens)、Web Assembly (WASM)、Uno Platform (iOS / macOS / Android / WebAssembly / UWP)。

.NET Core中使用SkiaSharp示例

安装SkiaSharp包

NuGet\Install-Package SkiaSharp -Version 2.88.3

使用SkiaSharp调整图片大小:

var rootPath = Directory.GetCurrentDirectory(); // 获取站点根目录using (var file = System.IO.File.OpenRead(rootPath + "\\1.png")) // 读取文件{using (var fileStream = new SKManagedStream(file)){using (var bitmap = SKBitmap.Decode(fileStream)){// 调整图片到100x80using (var resized = bitmap.Resize(new SKImageInfo(100, 80), SKFilterQuality.Medium)){if (resized != null){using (var image = SKImage.FromBitmap(resized)){using (var writeStream = System.IO.File.OpenWrite(rootPath + "\\new-1.png")){image.Encode(SKEncodedImageFormat.Png, 80).SaveTo(writeStream); // 保存文件}}}}}}

使用SkiaSharp创建验证码图片:

using (var surface = SKSurface.Create(new SKImageInfo(100, 80)))
{var canvas = surface.Canvas;canvas.Clear(SKColors.Blue);var paint = new SKPaint(){Color = SKColors.Red,IsAntialias = true, // 抗锯齿Style = SKPaintStyle.Fill,TextAlign = SKTextAlign.Center,TextSize = 16f,Typeface = SKTypeface.FromFamilyName("Microsoft YaHei", SKFontStyle.Bold)};var coord = new SKPoint(50, 48);canvas.DrawText("my text", coord, paint);using (var image = surface.Snapshot()){using (var writeStream = System.IO.File.OpenWrite(rootPath + "\\code-img.png")){image.Encode(SKEncodedImageFormat.Png, 80).SaveTo(writeStream);}}
}

也可以在canvas上画图片做一些截取图片的操作,可以调用canvas.DrawImage方法。
总体来说用法和原来的System.Drawing.Common库类似,旧的代码稍微做一些修改就可以了。

相关文章:

  • 用户管理第2节课--idea 2023.2 后端--实现基本数据库操作(操作user表) -- 自动生成 --【本人】
  • LeetCode 84. 柱状图中最大的矩形
  • flutter获取本地图片高度、宽度
  • 如何通过Arthas热更新正在运行中的java代码
  • go语言`json:“-“`标签的含义
  • Vue3-34-路由-路由配置参数 props
  • vue对日期的年、月、日进行增加,转换成指定格式的字符串(yyyy-MM-dd)
  • 2023年“中银杯”安徽省网络安全B模块(部分解析)
  • vivado 指定相对位置
  • 每天五分钟计算机视觉:揭秘迁移学习
  • 原生JS做别踩白块游戏
  • 算法系统学习(持续更新)
  • 栈实现后缀表达式的计算
  • 交换机02_共享式交换式
  • 了解并使用django-rest-framework-jwt
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 〔开发系列〕一次关于小程序开发的深度总结
  • Angular 4.x 动态创建组件
  • java中的hashCode
  • Laravel 菜鸟晋级之路
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • python学习笔记 - ThreadLocal
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • 高度不固定时垂直居中
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 坑!为什么View.startAnimation不起作用?
  • 强力优化Rancher k8s中国区的使用体验
  • 巧用 TypeScript (一)
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 网络应用优化——时延与带宽
  • 【云吞铺子】性能抖动剖析(二)
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 整理一些计算机基础知识!
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #、%和$符号在OGNL表达式中经常出现
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • (1)(1.13) SiK无线电高级配置(五)
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (二)WCF的Binding模型
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (一)插入排序
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET MVC第五章、模型绑定获取表单数据
  • .Net Winform开发笔记(一)
  • .NET 指南:抽象化实现的基类
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • @property @synthesize @dynamic 及相关属性作用探究
  • @软考考生,这份软考高分攻略你须知道