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

C# 压缩图片

.net下跨平台图像处理

https://github.com/mono/SkiaSharp

安装包

skiasharp
在这里插入图片描述

效果

在这里插入图片描述

代码

ImageCompression.cs

using SkiaSharp;namespace ImageCompressStu01
{/// <summary>/// 图片压缩/// </summary>public class ImageCompression{/// <summary>/// 压缩图片/// </summary>/// <param name="source">原文件位置</param>/// <param name="target">生成目标文件位置</param>/// <param name="maxWidth">最大宽度,根据此宽度计算是否需要缩放,计算新高度</param>/// <param name="quality">图片质量,范围0-100</param>public static void Compress(string source, string target, decimal maxWidth, int quality){using (var file = File.OpenRead(source))using (var fileStream = new SKManagedStream(file))using (var bitmap = SKBitmap.Decode(fileStream)){var width = (decimal)bitmap.Width;var height = (decimal)bitmap.Height;var newWidth = width;var newHeight = height;if (width > maxWidth){newWidth = maxWidth;newHeight = height / width * maxWidth;}using (var resized = bitmap.Resize(new SKImageInfo((int)newWidth, (int)newHeight), SKFilterQuality.Medium)){if (resized != null){using (var image = SKImage.FromBitmap(resized))using (var writeStream = File.OpenWrite(target)){image.Encode(SKEncodedImageFormat.Jpeg, quality).SaveTo(writeStream);}}}}}}
}

Program.cs

namespace ImageCompressStu01
{internal class Program{static void Main(string[] args){string source = "001.jpg";//实验1 不改变尺寸,图片质量改为80,存为jpg图片ImageCompression.Compress(source, "target-1.jpg", 1920, 80);//实验2 不改变尺寸,图片质量改为80,存为png图片ImageCompression.Compress(source, "target-2.png", 1920, 80);//实验3 尺寸缩放到宽度800,图片质量改为80,存为jpg图片ImageCompression.Compress(source, "target-3.jpg", 800, 80);//实验4 尺寸缩放到宽度800,图片质量改为60,存为jpg图片ImageCompression.Compress(source, "target-4.jpg", 800, 60);}}
}

这个是针对桌面或者控制台项目,web项目处理方式可以参考下面的方法

/// <summary>
/// 压缩图片
/// </summary>
/// <param name="file">IFormFile转化为stream</param>
/// <param name="maxWidth">最大宽度,根据此宽度计算是否需要缩放,计算新高度</param>
/// <param name="quality">图片质量,范围0-100</param>
public static byte[]? Compress(Stream file, decimal maxWidth, int quality)
{byte[]? result = null;using (var fileStream = new SKManagedStream(file))using (var bitmap = SKBitmap.Decode(fileStream)){var width = (decimal)bitmap.Width;var height = (decimal)bitmap.Height;var newWidth = width;var newHeight = height;if (width > maxWidth){newWidth = maxWidth;newHeight = height / width * maxWidth;}using (var resized = bitmap.Resize(new SKImageInfo((int)newWidth, (int)newHeight), SKFilterQuality.Medium)){if (resized != null){using (var image = SKImage.FromBitmap(resized)){result = image.Encode(SKEncodedImageFormat.Jpeg, quality).ToArray();}}}}return result;
}

IFormfile转stream方法如下

//内存流
var memory = new MemoryStream();
await formFile.CopyToAsync(memory);
//一定要重置一下,要不然执行压缩会报错
stream.Seek(0, SeekOrigin.Begin);
//文件流
var filePath = "xxxxx.txt";
using (var stream = System.IO.File.Create(filePath))
{await formFile.CopyToAsync(stream);
}

参考1
参考2

扩展

生成海报的开源库,可以跨平台使用
https://github.com/SixLabors/ImageSharp

相关文章:

C# 压缩图片

.net下跨平台图像处理 https://github.com/mono/SkiaSharp 安装包 skiasharp 效果 代码 ImageCompression.cs using SkiaSharp;namespace ImageCompressStu01 {/// <summary>/// 图片压缩/// </summary>public class ImageCompression{/// <summary>/…...

Linux: sysctl: rp_filter; 包到了内核,没有到socket,火星包martia

文章目录 rp_filter INTEGERsystemd -rhel7firewalld-0.6.3-11.el7.noarch相关的coderp_filter INTEGER 0 - No source validation. 1 - Strict mode as defined in RFC3704 Strict Reverse Path Each incoming packet is tested against the FIB and if the interface is not…...

Liunx两台服务器实现相互SSH免密登录

一、首先准备两台Linux虚拟机当作此次实验的两台服务器 服务器1&#xff1a;server IPV4&#xff1a;192.168.110.136 服务器2&#xff1a;client IPV4&#xff1a; 192.168.110.134 二、准备阶段 [rootserver ~]# systemctl disable firewalld #关…...

刷题笔记day03-链表

前言 今天是刷题的第三天&#xff0c;坚持就是胜利 203.移除链表元素 增加一个头结点&#xff0c;这样可以统一删除操作 另外&#xff0c;遇到等于的值&#xff0c;就让 prev 指向 curr.Next &#xff0c;同时将curr更新指向 prev.Next。 /*** Definition for singly-linked…...

Lua入门使用与基础语法

文章目录 目的基础说明开发环境基础语法注释数据类型变量流程控制函数 总结 目的 Lua是一种非常小巧的脚本语言&#xff0c;基于C构建并且完全开源&#xff0c;可以方便的嵌入到各种项目中&#xff0c;当然也可以单独使用。Lua经常被用在很多非脚本语言的项目中&#xff0c;用…...

RDMA概览

RDMA(Remote Direct Memory Access&#xff0c;远程直接内存访问)&#xff0c;指能够访问(读写)远程机器的内存。有多种支持RDMA的网络协议&#xff0c;包括&#xff1a;Infiniband、RoCE和iWAPP。具体的API定义包含在内核文件linux/include/rdma/ib_verbs.h reference: 【精选…...

设计模式(15)组合模式

一、介绍&#xff1a; 1、定义&#xff1a;组合多个对象形成树形结构以表示“整体-部分”的关系的层次结构。组合模式对叶子节点和容器节点的处理具有一致性&#xff0c;又称为整体-部分模式。 2、优缺点&#xff1a; 优点&#xff1a; &#xff08;1&#xff09;高层模块调…...

小黑子—spring:第一章

spring入门1.0 一 小黑子对spring基础进行概述1.1 spring导论1.2 传统Javaweb开发困惑及解决方法1.3 三大的思想提出1.3.1 IOC入门案例1.3.2 DI入门案例 1.4 框架概念1.5 初识spring1.5.1 Spring Framework 1.6 BeanFactory快速入门1.7 ApplicationContext快速入门1.8 BeanFact…...

【面向对象】理解面向对象编程中的封装性

封装性是面向对象编程中的重要概念之一&#xff0c;它允许开发者将数据和方法组合成一个独立的单元&#xff0c;并通过定义访问权限来控制对这个单元的访问。本文将深入探讨面向对象编程中的封装性&#xff0c;包括封装的概念、实现封装的方式以及封装的好处。通过详细的解释和…...

ES修改字段类型详解

一、需求概述 ES修改字段类型是指在已有的索引中&#xff0c;通过特定的操作方式将某个字段的类型修改为其它类型。当ES在建立索引的时候&#xff0c;已经确定好了每个字段的类型&#xff0c;而如果在建立后发现类型不符需求&#xff0c;就需要修改字段类型。 二、修改字段类…...

C++基础:函数模板

为了代码重用&#xff0c;代码必须是通用的&#xff1b;通用的代码就必须不受数据类型的限制。那么我们可以把数据类型改为一个设计参数&#xff0c;这种类型的程序设计称为参数化程序设计&#xff0c;软件模板有模板构造&#xff0c;包括函数模板和类模板。 函数模板可以用来…...

Facebook账号被封?那是因为没做对这些事

Facebook是全球最大的社交媒体平台之一&#xff0c;拥有数十亿的全球用户。它的主要产品包括Facebook&#xff08;面向个人用户的社交媒体平台&#xff09;、Instagram、WhatsApp和Messenger。同时他也是美国数字广告市场的主要参与者之一&#xff0c;其广告平台吸引了数百万广…...

虚拟机kafka

一、kafka安装 &#xff08;1&#xff09;解压 &#xff08;2&#xff09;修改名字为kafka212 &#xff08;3&#xff09;进入/opt/soft/kafka212/config目录&#xff0c;配置文件server.properties 21 broker.id0 36 advertised.listenersPLAINTEXT://192.168.91.11:9092 …...

软考 系统架构设计师系列知识点之设计模式(3)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之设计模式&#xff08;2&#xff09; 所属章节&#xff1a; 老版&#xff08;第一版&#xff09;教材 第7章. 设计模式 第2节. 设计模式实例 2. 结构型模式 结构型模式控制了应用程序较大部分之间的关系。它将以不同…...

217. 存在重复元素、Leetcode的Python实现

博客主页&#xff1a;&#x1f3c6;看看是李XX还是李歘歘 &#x1f3c6; &#x1f33a;每天分享一些包括但不限于计算机基础、算法等相关的知识点&#x1f33a; &#x1f497;点关注不迷路&#xff0c;总有一些&#x1f4d6;知识点&#x1f4d6;是你想要的&#x1f497; ⛽️今…...

49.Redis缓存设计与性能优化

缓存与数据库双写不一致小概率事件 //线程1 写数据库stock 5 ---------------》更新缓存 //线程2 写数据库stock 4 -----》更新缓存 //线程1 ------》写数据库stock 10 -----》删除缓存 //线程2 ---------------------------------------------------------------------…...

IDEA常用的一些插件

1、CodeGlance 代码迷你缩放图插件&#xff0c;可以快速拖动代码&#xff0c;和VScode一样 2、Codota 代码提示工具&#xff0c;扫描你的代码后&#xff0c;根据你的敲击完美提示。 Codota基于数百万个开源Java程序和您的上下文来完成代码行&#xff0c;从而帮助您以更少的…...

基于定容积法标准容器容积标定中的电动针阀自动化解决方案

摘要&#xff1a;在目前的六氟化硫气体精密计量中普遍采用重量法和定容法两种技术&#xff0c;本文分析了重量法中存在的问题以及定容法的优势&#xff0c;同时也指出定容法在实际应用中还存在自动化水平较低的问题。为了提高定容法精密计量过程中的自动化水平&#xff0c;本文…...

26 行为型模式-命令模式

1 命令模式介绍 2 命令模式原理 3 命令模式实现 模拟酒店后厨的出餐流程,来对命令模式进行一个演示,命令模式角色的角色与案例中角色的对应关系如下: 服务员: 即调用者角色,由她来发起命令. 厨师: 接收者,真正执行命令的对象. 订单: 命令中包含订单 /*** 订单类**/ public cl…...

一个Entity Framework Core的性能优化案例

概要 本文提供一个EF Core的优化案例&#xff0c;主要介绍一些EF Core常用的优化方法&#xff0c;以及在优化过程中&#xff0c;出现性能反复的时候的解决方法&#xff0c;并澄清一些对优化概念的误解&#xff0c;例如AsNoTracking并不包治百病。 本文使用的是Dotnet 6.0和EF…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...

若依登录用户名和密码加密

/*** 获取公钥&#xff1a;前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...

CppCon 2015 学习:Reactive Stream Processing in Industrial IoT using DDS and Rx

“Reactive Stream Processing in Industrial IoT using DDS and Rx” 是指在工业物联网&#xff08;IIoT&#xff09;场景中&#xff0c;结合 DDS&#xff08;Data Distribution Service&#xff09; 和 Rx&#xff08;Reactive Extensions&#xff09; 技术&#xff0c;实现 …...

五、jmeter脚本参数化

目录 1、脚本参数化 1.1 用户定义的变量 1.1.1 添加及引用方式 1.1.2 测试得出用户定义变量的特点 1.2 用户参数 1.2.1 概念 1.2.2 位置不同效果不同 1.2.3、用户参数的勾选框 - 每次迭代更新一次 总结用户定义的变量、用户参数 1.3 csv数据文件参数化 1、脚本参数化 …...