Asp.net core 学习笔记 Image processing (ImageSharp)
请移步修订版 : ASP.NET Core Library – ImageSharp
.net 的生态烂是真的, 很多硬需求都没有人做, 开源的做着做着就闭源了的也很多.
今天说说 image processing
早年都是用 system.draw, 但由于它依赖 windows, 后来 .net core 来了就有其它 player 进来完了.
https://devblogs.microsoft.com/dotnet/net-core-image-processing/
2017 年的时候就有好几个选择, 当时很多还不成熟, 有些不能跨平台, 或者部分平台可以而已.
https://www.reddit.com/r/dotnet/comments/lmknjq/net_core_image_processing_2021_edition/
2021 年有人对上面几个做了更新.
这里我主要记入一下我的 research
Magick.NET
是我目前用着的. Magick 是一个图像处理程序, 用 c 语言写的. 1999 年成立的公司.
Magick.NET 是 Magick 的核心成员做出来的 port. 目前整个项目只有他一个人在维护.
很强大, 该有的功能都有. 只是风险大了一些. 毕竟不是什么大公司, 人员也很少.
SkiaSharp
mono team 维护, 依靠 Google Skia 渲染. 功能很强. 也是属于 port 的 level. 比起 Magick.Net 风险少了很多.
毕竟背靠大公司吗, 哪怕团队小不是主菜, 也不会太糟糕.
ImageSharp
明日之星, 优点就是完全 c# 从 0 开发, 不依赖任何东西. 牛啊. 但是还很年轻.
很多功能都没有. 比如 webp 和 progressive jpeg 在 github issue 上最多 thumb. (webp 下一个版本就会支持了. )
不管怎样, 火的东西都得试一试, 给点支持嘛. 真的不行大不了用 SkiaSharp 啦.
这里记入一下它的常用方法.
官网 https://docs.sixlabors.com/articles/imagesharp/index.html?tabs=tabid-1
首先安装 nuget
dotnet add package SixLabors.ImageSharp
基本的 load image, 查看 width, height, exif
var fileFullPath = @"C:\keatkeat\projects\stooges-lib\stooges-aspnetcore\Project\wwwroot\uploaded-files\vertical-huawei.jpg"; using var image = Image.Load(fileFullPath); var w = image.Width; var h = image.Height; var exifOrientation = image.Metadata.ExifProfile.GetValue(ExifTag.Orientation);
修改图片 :
var newImage = image.Clone(imageProcessing => { imageProcessing.AutoOrient(); imageProcessing.Resize((int)Decimal.Divide(image.Width, 2), (int)Decimal.Divide(image.Width, 2)); imageProcessing.Crop(new Rectangle(x: 150, y: 150, width: 150, height: 150)); imageProcessing.Rotate(RotateMode.Rotate90); imageProcessing.Flip(FlipMode.Vertical); }); newImage.SaveAsJpeg( @"C:\keatkeat\projects\stooges-lib\stooges-aspnetcore\Project\wwwroot\uploaded-files\vertical-huawei-croped.jpg", new SixLabors.ImageSharp.Formats.Jpeg.JpegEncoder { Quality = 85 } );
Clone 就是复制多一张来改, 如果是直接改的话就把 Clone 换成 .Mutate()
AutoOrient 就是依据 exif orientation 来旋转和 flip 图片, 很方便, 不需要自己搞. (refer: https://www.cnblogs.com/keatkeat/p/7532183.html)
转换之后 exif orientation 会变成 1 (哪怕之前是 0, 比如 hua wei 手机是 0)
resize, crop, rotate, flip 都是比较常会用到的.
它还有一个 crop avatar 的 sample https://github.com/SixLabors/Samples/tree/master/ImageSharp/AvatarWithRoundedCorner
大概就是这样用呗.