网站开发的前端框架有哪些,三拼域名做网站长不长,网站备案ip地址段,泗县网站建设系列文章基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客#xff1f;基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目基于.NetCore开发博客项目 StarBlog - (3) 模型设计基于.NetCore开发博客项目 StarBlog - (4) markdown博客批量导入基于.N… 系列文章基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目基于.NetCore开发博客项目 StarBlog - (3) 模型设计基于.NetCore开发博客项目 StarBlog - (4) markdown博客批量导入基于.NetCore开发博客项目 StarBlog - (5) 开始搭建Web项目基于.NetCore开发博客项目 StarBlog - (6) 页面开发之博客文章列表基于.NetCore开发博客项目 StarBlog - (7) 页面开发之文章详情页面基于.NetCore开发博客项目 StarBlog - (8) 分类层级结构展示基于.NetCore开发博客项目 StarBlog - (9) 图片批量导入基于.NetCore开发博客项目 StarBlog - (10) 图片瀑布流基于.NetCore开发博客项目 StarBlog - (11) 实现访问统计基于.NetCore开发博客项目 StarBlog - (12) Razor页面动态编译基于.NetCore开发博客项目 StarBlog - (13) 加入友情链接功能基于.NetCore开发博客项目 StarBlog - (14) 实现主题切换功能基于.NetCore开发博客项目 StarBlog - (15) 生成随机尺寸图片...前言之前我写了一篇 .NetCore实现图片缩放与裁剪 - 基于ImageSharp里面有生成尺寸随机图片的算法同时也是StarBlog博客中原有的实现方式不过偶尔刷新页面的时候我注意到有些图片加载不出来调试了一下发现原来是报错了原本这个算法有bug。于是利用周末时间重新实现了一遍这下可以说是完美了~生成随机尺寸图片的功能目前用在文章卡片上原本使用的是LoremPicsum提供的服务但它的服务器在国外上线之后发现加载太慢了经常加载不出来于是决定自己实现一版。功能基础是上文提到的文章中的ImageSharp。主页推荐文章思路先理一下需求指定一个目录作为图片库位置把之前搜集的壁纸图片放进去大概放个几百张就行了吧遍历获取到库中的图片列表随机取出一张图片根据指定的尺寸缩放或裁剪图片其他的还有诸如指定随机seed、将seed与图片进行静态映射等扩展功能的实现。关键功能关键功能在于「根据指定的尺寸缩放或裁剪图片」难点在于裁剪和缩放图片要保证不改变图片原有的比例尽量保持图片原有的内容元素第一版我是将横屏和竖屏的图片分开处理在输入尺寸不超过原图尺寸的情况下先把比例接近的边调整成一样的大小再裁剪中间部分不过问题也很明显如果调整大小之后另一条边的长度小于输入长度那就会拉伸图片导致比例改变。在参考几个类似的MATLAB和Python项目之后我换了别的思路在输入尺寸不超过原图尺寸的情况下先按输入的尺寸比例裁剪、再调整尺寸如果超出原图尺寸则先按比例调整原图的大小再重复第一步举个例子比如原图是 1080 x 2340 的尺寸输入的图片是 400 x 200 尺寸那第一步判断尺寸不超过原图不需要缩放然后是「按输入的尺寸比例裁剪」把 400 x 200 化简成 2 : 1 的比例在原图中截取 2 : 1 的大小即 1080 x 540然后再把截取的图片调整到 400 x 200搞定看下效果原图输出(400x200)输出(200x300)虽然比一开始的方案更费一丢丢内存但却实实在在提升了出图成功率nice~代码实现直接上代码好了根据上面提到的思路分两步走代码也比一开始的方案更整洁async Task(Image, IImageFormat) GenerateSizedImageAsync(string imagePath, int width, int height) {await using var fileStream new FileStream(imagePath, FileMode.Open);var (image, format) await Image.LoadWithFormatAsync(fileStream);// 输出尺寸超出原图片尺寸放大if (width image.Width height image.Height) {image.Mutate(a a.Resize(width, height));}else if (width image.Width || height image.Height) {// 改变比例大的边if (width / image.Width height / image.Height)image.Mutate(a a.Resize(0, height));elseimage.Mutate(a a.Resize(width, 0));}// 将输入的尺寸作为裁剪比例var (scaleWidth, scaleHeight) GetPhotoScale(width, height);var cropWidth image.Width;var cropHeight (int) (image.Width / scaleWidth * scaleHeight);if (cropHeight image.Height) {cropHeight image.Height;cropWidth (int) (image.Height / scaleHeight * scaleWidth);}var cropRect new Rectangle((image.Width - cropWidth) / 2, (image.Height - cropHeight) / 2, cropWidth, cropHeight);image.Mutate(a a.Crop(cropRect));image.Mutate(a a.Resize(width, height));return (image, format);}里面还用到了计算图片比例很简单先算出图片宽度和高度的最大公约数然后宽高分别除以这个最大公约数就是比例了也就是化简分数计算最大公约数代码private static int GetGreatestCommonDivisor(int m, int n) {if (m n) (n, m) (m, n);while (n ! 0) {var r m % n;m n;n r;}return m;
}计算图片比例代码private static (double, double) GetPhotoScale(int width, int height) {if (width height) return (1, 1);var gcd GetGreatestCommonDivisor(width, height);return ((double)width / gcd, (double)height / gcd);
}参考资料Python PIL图片按比例裁剪https://blog.csdn.net/lly1122334/article/details/122365539python 等比例裁剪图片https://blog.csdn.net/chenping1993/article/details/110088858C#基础练习之求两个数的最大公约数与最小公倍数https://blog.csdn.net/maybe_ice/article/details/104328202