.Net Linux平台下System.Drawing.Imaging替代方案

news2024/11/19 1:47:08

文章目录

  • 前言
  • 一、ImageSharp库
  • 二、SkiaSharp库
  • 三、System.Drawing.Common库
  • 总结


前言

    在.NET Standard中,System.Drawing.Imaging 命名空间并不直接支持,因为 System.Drawing 命名空间主要是为了Windows Forms(WinForms)和GDI+设计的,而.NET Standard是一个跨平台的规范,旨在定义一套统一的API,使得.NET库能够在所有.NET实现中工作,包括.NET Core、.NET Framework、Xamarin等。


    对于需要在.NET Standard项目中进行图像处理的任务,有几种替代方案可以考虑:

一、ImageSharp库

    ImageSharp是一个跨平台的.NET图像处理库,它提供了丰富的API来处理图像,包括读取、写入、修改、转换等。它是.NET Standard 2.0及以上版本的兼容库,因此可以在.NET Core、.NET Framework等项目中使用。

安装ImageSharp:

Install-Package SixLabors.ImageSharp

使用ImageSharp进行基本的图像处理:

using SixLabors.ImageSharp;  
using SixLabors.ImageSharp.PixelFormats;  
using SixLabors.ImageSharp.Processing;var image = Image.Load<Rgba32>("path_to_your_image.jpg");  
image.Mutate(x => x  
    .Resize(new ResizeOptions {  
        Size = new Size(100, 100),  
        Mode = ResizeMode.Max  
    })  
    .Grayscale());  
​
image.Save("path_to_save_image.jpg");

    该组件库采用分层协议,可能存在法律风险,谨慎使用。
在这里插入图片描述

二、SkiaSharp库

    SkiaSharp是基于Skia图形库的.NET封装,Skia是一个由Google开发的开源2D图形处理库,支持多种平台。SkiaSharp同样支持.NET Standard,并且提供丰富的图像处理功能。

安装SkiaSharp:

Install-Package SkiaSharp

使用SkiaSharp进行图像处理:

using SkiaSharp;SKImageInfo info = new SKImageInfo(100, 100);  
using (SKBitmap bitmap = new SKBitmap(info))  
using (SKCanvas canvas = new SKCanvas(bitmap))  
{  
    SKPaint paint = new SKPaint  
    {  
        Color = SKColors.Red,  
        Style = SKPaintStyle.Fill,  
        IsAntiAlias = true  
    };  
​
    canvas.DrawRect(new SKRect(0, 0, 100, 100), paint);using (SKImage image = SKImage.FromEncodedData(SKData.FromEncodedImage(SKEncodedImage.FromEncodedData(File.ReadAllBytes("path_to_your_image.jpg")))))  
    using (SKData data = image.Encode(SKEncodedImageFormat.Png, 100))  
    {  
        using (SKFileWStream wstream = new SKFileWStream("path_to_save_image.png"))  
        {  
            data.SaveTo(wstream);  
        }  
    }  
}

三、System.Drawing.Common库

    如果你的应用程序主要运行在Windows上,你也可以考虑在.NET Standard项目中通过条件编译或使用NuGet包来引入对System.Drawing.Common的引用,但请注意这会使你的应用程序依赖于Windows环境。

    安装System.Drawing.Common(请注意,它不支持所有.NET Standard版本,并且通常与.NET Core一起使用):

Install-Package System.Drawing.Common

官方说明不支持non-windows
在这里插入图片描述

官方说明不支持non-windwos的原因:
在这里插入图片描述

    但实际上可以通过在Linux上安装libgdiplus库,从而使System.Drawing.Common库有依赖,但是官方说明libgdiplus问题较多,所以此方案还是慎重考虑。


总结

    从上述分析,本人更加推荐SkiaSharp库,在达到目的的同时,还可以规避法律风险,同时SkiaSharp库在性能上会自动使用硬件加速,相对来说也是更优的。

“笑对人生,智慧同行!博客新文出炉,微信订阅号更新更实时,等你笑纳~”
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2065949.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FPGA第 5 篇,FPGA技术优略势,FPGA学习方向,FPGA学习路线,FPGA专业知识的学习方向(FPGA现场可编程门阵列学习路线和方向)

前言 前几篇讲了一下FPGA的发展和应用&#xff0c;以及未来前景。具体详细&#xff0c;请看 FPGA发展和应用&#xff0c;以及未来前景https://blog.csdn.net/weixin_65793170/category_12665249.html 这里我们来&#xff0c;记录一下&#xff0c;FPGA专业知识的学习路线 一.…

World of Warcraft [CLASSIC] the Eye of Eternity [EOE] P1-P2

World of Warcraft [CLASSIC] the Eye of Eternity [EOE] 永恒之眼&#xff08;蓝龙&#xff09; 第一阶段 第二阶段 第三阶段 载具1-6技能介绍 World of Warcraft [CLASSIC] the Eye of Eternity [EOE]_永恒之眼 eoe-CSDN博客 永恒之眼怎么出副本呢&#xff0c;战斗结束&am…

泛微E9如何更新缓存

泛微E9如何更新缓存 在E9中&#xff0c;是默认开启了数据缓存的&#xff0c;如果直接操作数据库是会存在缓存不更新的问题&#xff0c;E9系统提供以下几种方式进行缓存清空的方式。 注&#xff1a;原则上禁止通过非程序渠道直接修改OA数据库数据&#xff0c;可以直接在页面进行…

LCR 162. 数字 1 的个数 题解

189轮转数组 189. 轮转数组 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 时间复杂度o&#xff08;n&#xff09;&#xff0c;空间复杂度 o&#xff08;1&#xff09; class Solution {public void rotate(int[] nums, i…

Python 如何使用 functools 模块

functools 模块是 Python 标准库中的一个重要模块&#xff0c;它提供了一些有用的高阶函数和工具&#xff0c;帮助开发者更轻松地操作和处理函数。functools 中的工具主要用于函数的缓存、包装、偏函数等功能。 1. functools 模块概述 functools 模块的设计目的是为了简化和增…

无人机+消防车:高楼灭火系统技术详解

“无人机消防车”高楼灭火系统技术是一种创新的消防解决方案&#xff0c;旨在解决高层建筑灭火难题。以下是对该技术的详细解析&#xff1a; 一、技术背景与需求 高层建筑数量多&#xff0c;火灾隐患多发。根据国家消防救援局发布的数据&#xff0c;高层建筑火灾频发&#xf…

MyBatis核心机制

实现MyBatis核心机制环境搭建 1.核心框架示意图 2.模块搭建 1.创建maven项目 2.引入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSc…

超维机器人在工业与能源领域的具身智能探索和应用

具身智能&#xff08;Embodied AI&#xff09;是指机器人能够通过其物理形态与环境的交互&#xff0c;进行感知、学习、决策和执行&#xff0c;从而完成复杂任务的能力。具身智能强调机器人不仅要具备感知环境和分析数据的能力&#xff0c;还要能够通过身体的行为和物理互动来适…

zabbix5.0与7.0版本区别 切换建议

Zabbix5.0和Zabbix7.0的区别 1. 性能和扩展性优化 1.1 高效的数据处理和存储 优化的数据库性能&#xff1a; Zabbix 7.0 在数据库层面进行了多项优化&#xff0c;以减少查询延迟和提高数据处理速度。这包括对数据库结构的改进和索引优化&#xff0c;使得大规模数据的读取和写…

Linux云计算 |【第二阶段】SECURITY-DAY3

主要内容&#xff1a; Prometheus监控服务器、Prometheus被监控端、Grafana监控可视化 补充&#xff1a;Zabbix监控软件不自带LNMP和DB数据库&#xff0c;需要自行手动安装配置&#xff1b;Prometheus监控软件自带WEB页面和DB数据库&#xff1b;Prometheus数据库为时序数据库&…

<数据集>翻越栏杆行为识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;512张 标注数量(xml文件个数)&#xff1a;512 标注数量(txt文件个数)&#xff1a;512 标注类别数&#xff1a;1 标注类别名称&#xff1a;[climbing] 使用标注工具&#xff1a;labelImg 标注规则&#xff1a;对类…

十五分钟两百行代码,手写一个vue项目全局通用的弹框

前言&#xff1a; 我们在写vue项目时&#xff0c;弹框是非常常用的组件&#xff0c;并且在同一个项目中&#xff0c;弹框大多类似。所以我们可以抽离封装出一个通用的弹框&#xff1b; 因为vue3可向下兼容&#xff0c;所以作者这边会使用vue2的写法&#xff0c;vue3写法大同小…

vue3 语法糖<script setup>

在 Vue 3 中&#xff0c;<script setup>是一种新的语法糖&#xff0c;它极大地简化了组件的编写方式。 <script setup> 是在单文件组件 (SFC) 中使用组合式 API 的编译时语法糖。当同时使用 SFC 与组合式 API 时该语法是默认推荐。 基本概念 简洁的语法&#xf…

使用Qg波形快速提取模型参数的新方法以准确捕获SiC MOSFET在不同负载条件下的开关特性

来源&#xff1a;Novel Methodology for Fast Model Parameter Extracting Using Qg Waveforms to Accurately Capture Switching Characteristics of SiC MOSFET Under Various Load Conditions&#xff08;ISPSD 24年&#xff09; 摘要 本文提出了一种快速提取模型参数的方…

类和对象(高级)

类和对象&#xff08;高级&#xff09; 一、运算符重载 运算符重载是对已有的运算符 指定新功能。不能创建新运算。 运算符重载关键字operator 思路&#xff1a; 1、弄懂运算符的运算对象的个数。&#xff08;个数决定了 重载函数的参数个数&#xff09; 2、识别运算符左边的…

【css】伪元素实现跟随鼠标移动的渐变效果

主要功能是在按钮上实现鼠标跟随渐变效果。每当用户将鼠标移动到按钮上时&#xff0c;按钮会显示一个以鼠标位置为中心的渐变效果。 1. 核心部分: 监听鼠标在元素内移动 监听鼠标在元素内移动&#xff0c;并触发该事件。 const handleMouseMove (e: MouseEvent) > {if (…

C#知识|语法拾遗:数据类型转换

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 其实关于数据转换在任何语言中都会涉及&#xff0c;无论是PLC编程语言&#xff0c;还是SCADA开发中的脚本语言&#xff0c;都会涉及&#xff0c;在前边学习JavaScript的内容时&#xff0c;也看过相关内容&#xff1a; …

[RAG]喂饭教程!Neo4J可视化GraphRAG索引

GraphRAG通过结合知识图谱&#xff0c;增加RAG的全局检索能力。今天我将讲解如何使用Neo4J可视化GraphRAG索引的结果&#xff0c;以便进一步的处理、分析&#xff0c;以小说提取的实体《仙逆》为例&#xff0c;一图胜千言。本文分为4小节&#xff0c;安装neo4j、导入GraphRAG索…

如何做服务端渲染?

node server 接收客户端请求&#xff0c;得到当前的请求url 路径&#xff0c;然后在已有的路由表内查找到对应的组件&#xff0c;拿到需要请求的数据&#xff0c;将数据作为 props、context或者store 形式传入组件 然后基于 react 内置的服务端渲染方法 renderToString()把组件…

vue一键打不同环境的包

1.配置package.json 主要看的是 "build:all": "vue-cli-service build && vue-cli-service build --mode test && vue-cli-service build --mode development", "scripts": {"dev": "vue-cli-service serve"…