很多情况下,在开发如PC、H5、小程序等综合平台的时候,图片的展示是个比较头疼的问题。尤其是有会员功能,会员可以上传图片的平台,更是一件麻烦事。 平台展示图片的地方,尺寸是定义好的。但用户不配合,上传的图片不能符合要求的话,就会出现拉伸和挤压的问题。非常影响浏览效果。而且现在的图片动辄几MB,十几MB的都有。按原图展示的话,那就太恐怖了!
在列表页,是趋向于正方形的
但是在详情页,就是长方形的了。
我们可以使用CSS的object-fit
来防止图片的拉伸与挤压,也可以使用CSS和JS来动态调整图片的大小与位置。但如果客户是上传了几MB甚至十几MB的图片。前端技术就没有优势了
还看到有一种方法,预先定义好各种尺寸,然后将上传的图片生成不同尺寸的缩略图保存起来,但这种做法是治标不治本的。也不是一个好方法
后来,随着各大云厂商提供各种图片服务,可以将图片动态裁剪和缩放,这种才是解决图片的一个好办法。其实现在各大公有云厂商已经提供了各种更好的解决方案,比如某里的是OSS+图片服务。某讯的COS+图片服务等等。如果你正在使用这些服务,下面的内容完全可以忽略掉!
使用文字进行分割
在接触了一段时间的ImageSharp
之后。也让我了解到ImageSharp
还有个ImageSharp.Web
,ImageSharp.Web
是可以将图片动态裁剪和缩放的一个开源项目。尝试了一下,效果还不错!下面,就使用ImageSharp.Web
来实现图片的动态裁剪和缩放。
ImageSharp.Web
完全可以直接在现有项目中使用。也可以单独进行部署。
下面一步一步进行图片服务的搭建!
2、安装ImageSharp.Web
包,并进行配置
以此点击工具
->NuGet包管理器
->管理解决方案的NuGet程序包
。或者打开程序包管理器控制台
。这里使用管理解决方案的NuGet程序包
进行包的安装。
在打开的窗口中,点击浏览
,在输入框中输入ImageSharp.Web
。在搜索结果中找到SixLabors.ImageSharp.Web
。然后在右侧勾选要安装的项目。最后点击安装。这里安装的版本是3.0.1
。
程序包管理控制台输入如下命令获取:
PM > Install-Package SixLabors.ImageSharp.Web -Version 3.0.1
安装完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;
builder.Services.AddImageSharp();
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
。效果如下:
说明动态裁剪和缩放生效了!
注意:各参数是使用官网的表达,由于英文实在不好,不敢乱翻译,有兴趣可以到ImageSharp.Web官网自行查看。
5、Securing Processing Commands
在ImageSharp.Web
中,采用一种HMAC
的技术来实现图片的保护功能。未做测试,有使用过的大佬请指点一下这玩意到底是个啥
在ImageSharp.Web
3.0开始,ImageSharp.Web
提供了ImageTag
功能。如果想要使用ImageTagHelper
,首先在_ViewImports.cshtml
添加引用
@addTagHelper *, SixLabors.ImageSharp.Web
然后就可以使用了,需要注意的是,在img
标签里使用ImageTagHelper
时,需要使用imagesharp
作为前缀。
最终的代码如下:
运行程序,可以看到如下效果:
什么意思呢?由于ImageSharp.Web
默认使用的是解决方案中的wwwroot
文件夹,但很多时候,我们需要使用项目以外的文件夹。这时,我们可以修改Program.cs
中的配置来实现效果!
为builder.Services.AddImageSharp()
增加Configure
配置。设置图片文件路径。完整代码如下:
builder.Services.AddImageSharp()
.Configure(options =>
{
options.ProviderRootPath = "d:/temp/upload";
});
配置完成后,就可以把图片存到d:/temp/upload
中,实现与wwwroot
进行分离了。效果如下:
好啦,ImageSharp.Web
的基础用法就介绍到这里,在ImageSharp.Web
还有很多功能,比如ImageCache
、ImageProviders
等功能的高级用法,以后有机会再进行研究!
完整文件下载