在 ImageResizer 中更改图像时 changes/edits 的顺序

Order of changes/edits when altering an image in ImageResizer

我在网络项目中使用ImageResizer 的Nuget 包。用户可以通过在受限 window 大小内平移、旋转和缩放原始图像来编辑他们的个人资料图像。

在我们旧的 ASP 经典图像编辑库中,我们可以在内存中加载原始文件的一个版本,然后在内存中执行转换并保存所需的大小等。这些转换的顺序很重要因为任何旋转都会影响 pan/crop 等的坐标。无论如何似乎都无法控制 ImageResizer 以什么顺序发生的事情,所以我正在做这样的事情。

WebRequest requestPic = WebRequest.Create("URL-of-original-image");
WebResponse responsePic = requestPic.GetResponse();

var settings = new Instructions();
settings.Rotate = submittedAngleforNewImage;

var imageRotated = new ImageJob(responsePic.GetResponseStream(), "location-to-save-temp-file", settings)
{AddFileExtension = true};
imageRotated.Build();

settings = new Instructions();
settings.CropRectangle = cropCoordsScaledArray;

var imageCropped = new ImageJob(imageRotated.FinalPath, "location-to-save-temp-file", settings)
{AddFileExtension = true};
imageCropped.Build();

然后,我通过加载 imageCropped 图像,以所需的尺寸(在本例中为三个)构建新图像。所以这里有很多重复创建构建作业,从磁盘加载文件等

如果我尝试一次完成转换,顺序是错误的...似乎在执行任何其他操作之前裁剪,但我无法确认顺序是什么。

有人对如何减少此处的代码量和磁盘读取量有任何想法,或者对我如何在保存前按设定顺序执行内存转换有任何建议吗?

谢谢

ImageResizer 的操作顺序是 trim whitespace -> srotate -> sflip -> crop -> scale -> filter -> pad -> rotate -> flip。如果您保存中间文件,请确保它们是 .png 格式,这样您就不会创建额外的压缩工件。

也就是说,您可能会考虑 Imageflow.NET,因为它可以控制操作顺序并且速度更快。但是,它还不支持不是 90 的倍数的旋转度数。你使用部分度数旋转吗?