前言

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

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

分析需求

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

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

我的思路是:

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

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

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

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

实现

首先读取图片

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

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

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

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

在网上查到的很多博客用的代码都是类似image.Resizeimage.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开发笔记系列里,接下来会更新~

参考资料

最新文章

  1. Angular2 Hello World 之 2.0.0-beta.14
  2. 你可能不知道的7个CSS单位
  3. 【NOIP 2004】虫食算
  4. vs.net 2005 C# WinForm GroupBOX 的BUG?尝试读取或写入受保护的内存。这通常指示其他内存已损坏
  5. rabbitmq——用户管理
  6. linux nginx安装
  7. 省部级干部list
  8. 单向链表在O(1)时间内删除一个节点
  9. python接口自动化-post请求3
  10. :before和::before的区别
  11. battery for stm32
  12. ajax 获取服务器返回的XML字符串
  13. iOS中大文件下载(单线程下载)
  14. HDU 4802 && HDU 4803 贪心,高精 && HDU 4804 轮廓线dp && HDU 4805 计算几何 && HDU 4811 (13南京区域赛现场赛 题目重演A,B,C,D,J)
  15. 位运算骚操作 Part 2
  16. Java编辑PPT的折线图,与内嵌Excel联动
  17. 2.06StuModify.aspx(修改姓名,性别,所在班级)
  18. Noip 2016 Day 1 & Day 2
  19. Java构造方法与析构方法实例剖析
  20. 团队介绍 you i

热门文章

  1. Python里的引用与拷贝规律
  2. Android实现秒开效果
  3. 1、【Python运维脚本】Python 按时间删除和清空文件
  4. CURDATE()与NOW()的区别
  5. 【Electron】Electron Icon 图标说明、及常见问题
  6. shell基础知识讲解
  7. 手写一个bind
  8. Istio实践(3)- 路由控制及多应用部署(netcore&springboot)
  9. js实现图片懒加载原理
  10. Dockerfile创建自有镜像