(突然发现断更有段时间了

最近在做博客的时候,需要实现一个类似Lorempixel、LoremPicsum这样的随机图片功能,图片有了,还需要一个根据输入的宽度高度获取图片的功能,由于之前处理图片时使用到了ImageSharp库,所以这次我立刻就想到用它。

图片库中的图片基本都是我之前收集的壁纸什么的,尺寸参差不齐,有横屏的也有竖屏

然后包装成接口只需要输入宽度和高度,就能随机选一张图片然后进行缩放或者裁剪

我的思路是:

  • 横屏图片,将高度调整到与输入高度一致,宽度按比例调整

  • 竖屏图片,将宽度调整到与输入高度一致,高度按比例调整

然后再选取中间部分进行截取

当然还有特殊情况,就是输入的宽度和高度超过图片原来高度宽度的情况,这个只能破坏图片原有的比例,强行进行拉伸~

PS:本来想画个图表达一下思路,不过没找到趁手的画图工具(Draw.io:不要看我)

首先读取图片

很简单,传入图片路径即可

当然也可以用流的方式读取

using var image = Image.Load("imagePath");

然后就是根据图片的大小各种情况来进行缩放和裁剪

在网上查到的很多博客用的代码都是类似 image.Resize image.Crop 之类的,但这是旧版的ImageSharp代码

新版全都放在 image.Mutate 里,要什么操作再传入lambda表达式

(有点像ORM的操作)

比如缩放就是这样

image.Mutate(a => a.Resize(newWidth, newHeight));

裁剪就是这样

image.Mutate(a => a.Crop(new Rectangle(x, y, width, height)));

功能很简单,完整代码在此

void GetImage(string imagePath, int width, int height) {
    using var image = Image.Load(imagePath);
    Rectangle cropRect;
    int newWidth;
    int newHeight;
    // 横屏图片
    if (image.Width > image.Height) {
        if (width > image.Width) {
            newWidth = width;
            newHeight = height;
        else {
            newHeight = height;
            newWidth = image.Width / image.Height * newHeight;
        cropRect = new Rectangle((newWidth - width) / 2, 0, width, height);
    // 竖屏图片
    else {
        if (height > image.Height) {
            newWidth = width;
            newHeight = height;
        else {
            newWidth = width;
            newHeight = newWidth * image.Height / image.Width;
        cropRect = new Rectangle(0, (newHeight - height) / 2, width, height);
    image.Mutate(a => a.Resize(newWidth, newHeight));
    image.Mutate(a => a.Crop(cropRect));
    image.SaveAsPng("output.png");
 

后续在我的StarBlog开发笔记系列里,接下来会更新~

  • 随机图片网站:https://picsum.photos/

  • .NetCore如何使用ImageSharp进行图片的生成:https://www.cnblogs.com/niwan/p/11126239.html

  • https://stackoverflow.com/questions/63639644/how-load-an-image-from-disk-and-save-to-a-stream-using-imagesharp-while-preservi

前言(突然发现断更有段时间了最近在做博客的时候,需要实现一个类似Lorempixel、LoremPicsum这样的随机图片功能,图片有了,还需要一个根据输入的宽度高度获取图片的功能,由于之前处理图片时使用到了ImageSharp库,所以这次我立刻就想到用它。分析需求图片库中的图片基本都是我之前收集的壁纸什么的,尺寸参差不齐,有横屏的也有竖屏然后包装成接口只需要输入宽度和高... "带 MediaTR 的 CQRS 阅读我的教程: 第 1 部分: medium.@ducmeitnet-core-using-cqrs-pattern-with-mediatr-part-1-55557e90931b 第 2 部分: medium.@ducmeitnet-core-using-cqrs-pattern-with-mediatr-part-2-cc55763e83f0 使用 MediatR 的 CQRS 和 SubPub 示例 有使用 Entity Framework Core - Code First 的经验。 有使用 ASP.NET Core 和 Rest API 的经验 可选:有使用 Docker 的经验 设置 MS SQL Server 以运行数据库 使用 Customer.API 项目启动项目 Customer.API:API层 Customer.Data:数据层 Customer.Domain:模型层 客户服务:应用层 运行 MSSQL Docker: docker run 在我们日常开发中,附件的上传下载是必备的功能组件,那么在延伸一下功能,图片类型的文件,我们可以做一些缩略图功能。 关于缩略图的方案,大致方向有两种:第一种是图片服务器直接存放多张图片,另外一种则是只存一张图片,然后通过nginx或者对文件的直接压缩返回。很明显,前者浪费空间,后者才是我们想要的,如果你们生产环境空间很足,那你们也可以搞第一种。 关于用nginx还是直接对文件进行压缩返回,还是要根据自己生产环境的情况来定制开发方案,由于我们生产环境是windows的,查阅过nginx一些关于缩略图的资料 using System.Collections.Generic; using SixLabors.ImageSharp; using SixLabors.ImageSharp.Processing; using System.Numerics; using SixLabors.ImageSharp.PixelFormats; namespace ImageSharpLearn class Pro..
.NET Core 是由微软开发的跨平台版本的 .NET 框架。WS-Federation 是用于实现单点登录 (SSO) 的一种 Web 服务协议。 在 .NET Core实现 WS-Federation 的示例可能需要使用第三方库,如 Microsoft.AspNetCore.Authentication.WsFederation。 示例代码可能长这样: using Microsoft.AspNetCore.Authentication.WsFederation; services.AddAuthentication(sharedOptions => sharedOptions.DefaultScheme = WsFederationDefaults.AuthenticationScheme; .AddWsFederation(options => options.MetadataAddress = "https://your-sts.com/federationmetadata/2007-06/federationmetadata.xml"; options.Wtrealm = "https://your-app.com/"; 这个是一个概要,具体实现需要更多代码和配置以及参考文档进行查询