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

news/2024/5/19 21:30:36 标签: .netcore, SkiaSharp

        在.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))
        {
                // 调整图片到100x80
                using (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库类似,旧的代码稍微做一些修改就可以了。


http://www.niftyadmin.cn/n/5300407.html

相关文章

冒泡排序-排序算法

前言 如果有6个人站成一排,要将他们按从矮到高的顺序排列。你可能有多种方式来完成。但是如果其中有一个人特别高,比他身边的人高,在队伍中特别明显,你可以轻易看出那个最高的需要和身边的人交换位置,这是冒泡排序的核…

数据结构OJ实验15-插入排序与交换排序

A. DS内排—直插排序 题目描述 给定一组数据,使用直插排序完成数据的升序排序。 --程序要求-- 若使用C只能include一个头文件iostream;若使用C语言只能include一个头文件stdio 程序中若include多过一个头文件,不看代码,作0分…

数据结构和算法-算法的基本概念和时间复杂度和空间复杂度

文章目录 算法的基本概念总览什么是算法算法的特性好算法的特质小结 算法的时间复杂度如何评判算法时间开销计算算法时间复杂度忽略表达式的某些部分是否要一行一行数代码 小练习1小练习2最坏时间复杂度和平均时间复杂度小结 算法的空间复杂度程序运行时的内存需求函数递归的空…

background-attachment 属性详解

background-attachment 属性详解 大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,让我们深入研究一下前端开发中常用的CSS属性之一——background-a…

Spring技术内幕笔记之IOC的实现

IOC容器的实现 依赖反转: 依赖对象的获得被反转了,于是依赖反转更名为:依赖注入。许多应用都是由两个或者多个类通过彼此的合作来实现业务逻辑的,这使得每个对象都需要与其合作的对象的引用,如果这个获取过程需要自身…

彻底理解前端安全面试题(2)—— CSRF 攻击,跨站请求伪造攻击详解,建议收藏(含源码)

前言 前端关于网络安全看似高深莫测,其实来来回回就那么点东西,我总结一下就是 3 1 4,3个用字母描述的【分别是 XSS、CSRF、CORS】 一个中间人攻击。当然 CORS 同源策略是为了防止攻击的安全策略,其他的都是网络攻击。除了这…

【计算机图形学】NAP: Neural 3D Articulation Prior

文章目录 1. 这篇论文做了什么事,有什么贡献?2. Related Work铰接物体建模3D中的Diffusion model扩散模型 3. Pipeline铰接树参数化基于Diffusion的铰接树生成去噪网络 4. 实验评价铰接物体生成——以往做法与本文提出的新指标NAP捕捉到的铰接物体分布质…

python 画图转化为html

优点:画图转化为html可以手动拖动。并且可以放大缩小 示例一 import matplotlib.pyplot as plt import mpld3# 准备数据和图表 x [1, 2, 3, 4, 5] y [2, 3, 5, 7, 11]fig, ax plt.subplots(figsize (10,10)) ax.plot(x, y, o-, labelData Points) ax.set_xlabe…