ImageSharp.Web实战:轻松搭建高效图片服务

很多情况下,在开发如PC、H5、小程序等综合平台的时候,图片的展示是个比较头疼的问题。尤其是有会员功能,会员可以上传图片的平台,更是一件麻烦事。 平台展示图片的地方,尺寸是定义好的。但用户不配合,上传的图片不能符合要求的话,就会出现拉伸和挤压的问题。非常影响浏览效果。而且现在的图片动辄几MB,十几MB的都有。按原图展示的话,那就太恐怖了!

例如如下案例:

在列表页,是趋向于正方形的
在这里插入图片描述
但是在详情页,就是长方形的了。
在这里插入图片描述
我们可以使用CSS的object-fit来防止图片的拉伸与挤压,也可以使用CSS和JS来动态调整图片的大小与位置。但如果客户是上传了几MB甚至十几MB的图片。前端技术就没有优势了

还看到有一种方法,预先定义好各种尺寸,然后将上传的图片生成不同尺寸的缩略图保存起来,但这种做法是治标不治本的。也不是一个好方法

后来,随着各大云厂商提供各种图片服务,可以将图片动态裁剪和缩放,这种才是解决图片的一个好办法。其实现在各大公有云厂商已经提供了各种更好的解决方案,比如某里的是OSS+图片服务。某讯的COS+图片服务等等。如果你正在使用这些服务,下面的内容完全可以忽略掉!


使用文字进行分割

目录标题

  • 1、新建一个项目
  • 2、安装`ImageSharp.Web`包,并进行配置
  • 3、配置`ImageSharp.Web`。
  • 4、`ImageSharp.Web` 参数一览
  • 5、Securing Processing Commands
  • 6、ImageTagHelper
  • 7、如何使用外部文件夹?
  • 完整文件下载

在接触了一段时间的ImageSharp之后。也让我了解到ImageSharp还有个ImageSharp.WebImageSharp.Web是可以将图片动态裁剪和缩放的一个开源项目。尝试了一下,效果还不错!下面,就使用ImageSharp.Web来实现图片的动态裁剪和缩放。

ImageSharp.Web完全可以直接在现有项目中使用。也可以单独进行部署。
下面一步一步进行图片服务的搭建!

1、新建一个项目

打开 Visual Studio 2022,选择ASP.NET Core Web应用,点击下一步
在这里插入图片描述
给项目起个高大上的名字。选择保存位置,点击下一步
在这里插入图片描述
选择目标框架,这里选择的是.NET 7.0,将配置HTTPS前面的勾去掉。省的调试时还要安装证书。然后点击创建
创建后的目录结构是这样的。
在这里插入图片描述

2、安装ImageSharp.Web包,并进行配置

以此点击工具->NuGet包管理器->管理解决方案的NuGet程序包。或者打开程序包管理器控制台。这里使用管理解决方案的NuGet程序包进行包的安装。
在这里插入图片描述
在打开的窗口中,点击浏览,在输入框中输入ImageSharp.Web。在搜索结果中找到SixLabors.ImageSharp.Web。然后在右侧勾选要安装的项目。最后点击安装。这里安装的版本是3.0.1
在这里插入图片描述
程序包管理控制台输入如下命令获取:

PM > Install-Package SixLabors.ImageSharp.Web -Version 3.0.1

3、配置ImageSharp.Web

安装完ImageSharp.Web包之后,打开项目根目录的Program.cs。默认的代码是这样的:

var builder = WebApplication.CreateBuilder(args);// Add services to the container.
builder.Services.AddControllersWithViews();var app = builder.Build();// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();app.UseRouting();app.UseAuthorization();app.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");app.Run();

首先引入SixLabors.ImageSharp.Web.DependencyInjection命名空间

using SixLabors.ImageSharp.Web.DependencyInjection;

添加ImgeSharp服务

builder.Services.AddImageSharp();

最后注册ImageSharp中间件。

app.UseImageSharp();

最终的Program.cs代码如下:

using SixLabors.ImageSharp.Web.DependencyInjection;var builder = WebApplication.CreateBuilder(args);// Add services to the container.
builder.Services.AddControllersWithViews();
//添加ImageSharp服务
builder.Services.AddImageSharp();var app = builder.Build();// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{app.UseExceptionHandler("/Home/Error");
}
//注册ImageSharp中间件
app.UseImageSharp();app.UseStaticFiles();app.UseRouting();app.UseAuthorization();app.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");app.Run();

注意app.UseImageSharp()一定要放在app.UseStaticFiles()之前。否则不会生效。

为了避免引起不必要的麻烦,我本机截屏了一张图,起名为1.png,放到 wwwroot目录下。然后按F5运行项目。访问这张图片,效果如下!
在这里插入图片描述
然后在图片后面增加参数width=300&height=300。效果如下:
在这里插入图片描述
说明动态裁剪和缩放生效了!

4、ImageSharp.Web 参数一览

  • Resize 参数
    • width:The width of the image in px. Use only one dimension to preseve the aspect ratio.

    • height:The height of the image in px. Use only one dimension to preseve the aspect ratio.

    • rmode:The ResizeMode to use.

      ResizeMode参数及说明

      NameDescription
      BoxPadPads the image to fit the bound of the container without resizing the original source. When downscaling, performs the same functionality as Pad
      CropCrops the resized image to fit the bounds of its container.
      ManualThe target location and size of the resized image has been manually set.
      MaxConstrains the resized image to fit the bounds of its container maintaining the original aspect ratio.
      MinResizes the image until the shortest side reaches the set given dimension. Upscaling is disabled in this mode and the original image will be returned if attempted.
      PadPads the resized image to fit the bounds of its container. If only one dimension is passed, will maintain the original aspect ratio.
      StretchStretches the resized image to fit the bounds of its container.
    • rsampler :The IResampler sampler to use

      • bicubic Bicubic
      • nearest NearestNeighbor
      • box Box
      • mitchell MitchellNetravali
      • catmull CatmullRom
      • lanczos2 Lanczos2
      • lanczos3 Lanczos3
      • lanczos5 Lanczos5
      • lanczos8 Lanczos8
      • welch Welch
      • robidoux Robidoux
      • robidouxsharp RobidouxSharp
      • spline Spline
      • triangle Triangle
      • hermite Hermite
    • ranchor : The AnchorPositionMode to use.

    • rxy : Use an exact anchor position point. The comma-separated x and y values range from 0-1.

    • orient : Whether to swap command dimensions based on the presence of EXIF metadata indicating rotated (not flipped) images. Defaults to true

    • compand : Whether to compress and expand individual pixel colors values to/from a linear color space when processing. Defaults to false

  • Format 参数:
    • bmp
    • gif
    • jpg
    • pbm
    • png
    • tga
    • tiff
    • webp
  • Quality参数:
    Allows the encoding of the output image at the given quality.
    • For Jpeg this ranges from 1—100.
    • For WebP this ranges from 1—100.
  • Background Color 参数:
    Allows the changing of the background color of transparent images.

注意:各参数是使用官网的表达,由于英文实在不好,不敢乱翻译,有兴趣可以到ImageSharp.Web官网自行查看。

5、Securing Processing Commands

ImageSharp.Web中,采用一种HMAC的技术来实现图片的保护功能。未做测试,有使用过的大佬请指点一下这玩意到底是个啥

6、ImageTagHelper

ImageSharp.Web3.0开始,ImageSharp.Web提供了ImageTag功能。如果想要使用ImageTagHelper,首先在_ViewImports.cshtml添加引用

@addTagHelper *, SixLabors.ImageSharp.Web

然后就可以使用了,需要注意的是,在img标签里使用ImageTagHelper时,需要使用imagesharp作为前缀。
在这里插入图片描述
最终的代码如下:

<div style="width:700px; margin:0 auto"><imgsrc="/1.png"imagesharp-width="500"imagesharp-height="300"imagesharp-format="Format.WebP"imagesharp-rmode="ResizeMode.Crop" />
</div>

运行程序,可以看到如下效果:
在这里插入图片描述

7、如何使用外部文件夹?

什么意思呢?由于ImageSharp.Web默认使用的是解决方案中的wwwroot文件夹,但很多时候,我们需要使用项目以外的文件夹。这时,我们可以修改Program.cs中的配置来实现效果!
builder.Services.AddImageSharp()增加Configure配置。设置图片文件路径。完整代码如下:

builder.Services.AddImageSharp().Configure<PhysicalFileSystemProviderOptions>(options =>{options.ProviderRootPath = "d:/temp/upload";});

配置完成后,就可以把图片存到d:/temp/upload中,实现与wwwroot进行分离了。效果如下:
在这里插入图片描述

好啦,ImageSharp.Web的基础用法就介绍到这里,在ImageSharp.Web还有很多功能,比如ImageCacheImageProviders等功能的高级用法,以后有机会再进行研究!

完整文件下载

点击下方公众号卡片,关注我,回复1009 下载!

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

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

相关文章

开发总结:webpack

webpack官网webpack | webpack 中文文档 | webpack 中文网 一、什么是webpack webpack 可以看做是模块打包机&#xff0c;它所做的事情是&#xff1a;分析你的项目结构&#xff0c;找到JavaScript 模块以及其它的一些浏览器不能直接运行的拓展语言&#xff08;Scss&#xff0…

Segment Routing原理

以上内容均属原创&#xff0c;如有不详或错误&#xff0c;敬请指出。本文作者&#xff1a; 坏坏 本文链接&#xff1a; http://t.csdn.cn/2fUE5 版权声明&#xff1a; 本博客所有文章除特别声明外&#xff0c;如需转载&#xff0c;请联系作者注明出处并附带本文链接&#xf…

处理时延降低24倍,联通云粒数据引擎优化实践

*作者&#xff1a;郑扬勇&#xff0c;云粒星河数据中台产品负责人 云粒智慧科技有限公司成立于 2018 年 6 月&#xff0c;是中国联通集团混改以来成立的首家合资公司&#xff0c;是中国智慧城市数智化建设者。一直以来&#xff0c;云粒智慧以数字化、智能化、集约化产品为核心&…

CS144(2023 Spring)Lab 0:networking warmup(环境搭建 webget bytestream)

文章目录 前言其他笔记相关链接 1. Set up GNU/Linux on your computer2. Networking by hand3. Writing a network program using an OS stream socket3.1 Linux配置3.2 C规范3.3 Writing webget3.3.1 实现3.3.2 测试 4. An in-memory reliable byte stream4.1 思路分析4.2 代…

HTTPS安全通信和SSL Pinning

随着互联网的迅速发展&#xff0c;网络通信安全问题日益凸显。在这一背景下&#xff0c;HTTPS作为一种加密通信协议得到了广泛应用&#xff0c;以保障用户的数据隐私和信息安全。本文将介绍HTTPS的基本原理、发展历程&#xff0c;以及与之相关的中间人攻击和防护方法。 1. HTT…

Lesson4-1:OpenCV图像特征提取与描述---角点特征

学习目标 理解图像的特征知道图像的角点 1 图像的特征 大多数人都玩过拼图游戏。首先拿到完整图像的碎片&#xff0c;然后把这些碎片以正确的方式排列起来从而重建这幅图像。如果把拼图游戏的原理写成计算机程序&#xff0c;那计算机就也会玩拼图游戏了。 在拼图时&#xff…

linux定时删除服务器日志

不说废话。直接进入操作流程 linux 定时任务是用的crontab 查看 crontab是否启动 service crond statusdead 死的 启动crontab service crond start 再次查看状态 running 运转的 查看 crontab cat /etc/crontab 查看 crontab任务 crontab -l 编辑 crontab任务 crontab …

进程、操作系统

文章目录 一、冯诺依曼体系&#xff08;Von Neumann Architecture&#xff09;1. 概述2. CPU 二、操作系统&#xff08;Operating System&#xff09;三、进程(process)/任务(task) 一、冯诺依曼体系&#xff08;Von Neumann Architecture&#xff09; 1. 概述 分类 CPU 中央处…

气候变化下的DNDC模拟

DNDC&#xff08;Denitrification-Decomposition&#xff0c;反硝化-分解模型&#xff09;是目前国际上最为成功的模拟生物地球化学循环的模型之一&#xff0c;自开发以来&#xff0c;经过不断完善和改进&#xff0c;从模拟简单的农田生态系统发展成为可以模拟几乎所有陆地生态…

记一次Zip Slip任意文件写漏洞 以及一些参考文章

记一次Zip Slip任意文件写漏洞以及参考文章们 记一次Zip Slip任意文件写漏洞漏洞复现漏洞原理分析扩展延申 参考文章一&#xff1a;Java之解压流&#xff08;ZipInputStream&#xff09;参考文章二&#xff1a;Zip Slip VulnerabilityExploitable Application FlowAre you Vuln…

中级深入--day15

案例&#xff1a;使用BeautifuSoup4的爬虫 我们以腾讯社招页面来做演示&#xff1a;搜索 | 腾讯招聘 使用BeautifuSoup4解析器&#xff0c;将招聘网页上的职位名称、职位类别、招聘人数、工作地点、发布时间&#xff0c;以及每个职位详情的点击链接存储出来。 # bs4_tencent.p…

【Linux】线程安全-生产者消费者模型

文章目录 生产者消费者模型123规则应用场景优点忙闲不均生产者和消费者解耦支持高并发 代码模拟 生产者消费者模型 123规则 1个线程安全的队列&#xff1a;只要保证先进先出特性的数据结构都可以称为队列 这个队列要保证互斥&#xff08;就是保证当前只有一个线程对队列进行操…

交换机端口安全

文章目录 一、802.1X认证1. 定义和起源2. 认证方式本地认证远程集中认证 3. 端口接入控制方式基于端口认证基于MAC地址认证 二、端口隔离技术1. 隔离组2. 隔离原理3. 应用场景 首先可以看下思维导图&#xff0c;以便更好的理解接下来的内容。 一、802.1X认证 1. 定义和起源 8…

代码随想录算法训练营第39天 | ● 62.不同路径 ● 63. 不同路径II

文章目录 前言一、62.不同路径二、63.不同路径II总结 前言 动态规划 一、62.不同路径 深搜动态规划数论 深搜&#xff1a; 注意题目中说机器人每次只能向下或者向右移动一步&#xff0c;那么其实机器人走过的路径可以抽象为一棵二叉树&#xff0c;而叶子节点就是终点&#…

uniapp项目实战系列(2):新建项目,项目搭建,微信开发工具的配置

目录 系列文章目录uniapp项目实战系列(1)&#xff1a;导入数据库&#xff0c;启动后端服务&#xff0c;开启代码托管&#xff08;点击跳转&#xff09;1.新建项目2.托管项目的操作&#xff1a;&#xff08;无勾选托管项目可无视&#xff09;3.项目编译预览3.1游览器编译3.2微信…

【数据结构与算法篇】手撕八大排序算法之交换排序

​&#x1f47b;内容专栏&#xff1a; 《数据结构与算法篇》 &#x1f428;本文概括&#xff1a;常见交换排序包括冒泡排序与快速排序&#xff0c;本篇讲述冒泡排序与快速排序的思想及实现、复杂度分析。 &#x1f43c;本文作者&#xff1a; 花 蝶 &#x1f438;发布时间&#…

Darshan日志分析

标头 darshan-parser 输出的开头显示了有关作业的总体信息的摘要。还可以使用–perf、–file或–total命令行选项生成其他作业级别摘要信息。 darshan log version&#xff1a;Darshan 日志文件的内部版本号。compression method&#xff1a;压缩方法。exe&#xff1a;生成日志…

skywalking agent监控java服务

一、前言 skywalking agent可以监控的服务类型有多种&#xff0c;python、go、java、nodejs服务等都可以监控&#xff0c;现在通过java服务来演示skywalking agent的使用&#xff0c;并且是使用容器的方式实现 二、部署skywalking agent监控 需要注意&#xff0c;skywalking…

Django报错:SystemCheckError: System check identified some issues解决办法

今天练习django自定义标签时&#xff0c;一开始在APPbook中写了自定义标签book_tags.py 测试成功&#xff0c;之后新建了一个APPblogs&#xff0c;测试在blogs中创建模板使用自定义标签&#xff0c;于是直接把book/templatetags包直接赋值到blogs目录里。在页面里加载自定义标…

K8s简介之什么是K8s

目录 1.概述 2.什么是容器引擎&#xff1f; 3.什么是容器 4.什么是容器编排&#xff1f; 5.容器编排工具 6.到底什么是K8s? 7.为什么市场推荐K8s 8.K8s架构 9.K8s组件 Pods API 服务器 调度器 控制器管理器 Etcd 节点 Kubelet Kube代理 Kubectl 1.概述 Kub…