c# - 是否有可能使这两种方法通用或至少分开?
问题描述
我在 C# 中使用 ImageProcessor,我无法想出一种方法来从其方法中创建一个通用方法,以避免多次编写相同的代码。
说,我有两种方法,裁剪和调整大小。
public Image Resize(Image image, int width, int height)
{
// Create a Image to be returned after being scaled, call it resizedImage:
Image resizedImage;
// Create a Size for the image to be scaled to, call it size:
var size = new Size(width, height);
// Create an ImageFactory to process the image, call it imageFactory:
using (var imageFactory = new ImageFactory(preserveExifData: true))
{
// Create a MemoryStream to temporarily store the processed image, call it imageStream:
using (var imageStream = new MemoryStream())
{
// Scale the image using the ImageProcessor library
// Load the image to be resized, resize it and save it to the MemoryStream:
imageFactory.Load(image)
.Resize(size)
.Save(imageStream);
// Assign the processed image to the previously declared resizedImage:
resizedImage = Image.FromStream(imageStream);
}
}
// Return the resized image:
return resizedImage;
}
public Image Crop(Image image, float left, float top, float right, float bottom, bool isModePercentage = true)
{
// Create a Image to be returned after being cropped, call it croppedImage:
Image croppedImage;
// Create a CropMode to specify what cropping method to use (Percentage or Pixels), call it cropMode
// If isModePercentage = true we use CropMode.Percentage, otherwise use CropMode.Pixels:
var cropMode = isModePercentage ? CropMode.Percentage : CropMode.Pixels;
// Create a CropLayer to specify how and how much the image should be cropped, call it cropLayer:
var cropLayer = new CropLayer(left, top, right, bottom, cropMode);
// Create an ImageFactory to process the image, call it imageFactory:
using (ImageFactory imageFactory = new ImageFactory(preserveExifData: true))
{
// Create a MemoryStream to temporarily store the processed image, call it imageStream:
using (MemoryStream imageStream = new MemoryStream())
{
// Crop the image using the ImageProcessor library
// Load the image to be cropped, crop it and save it to the MemoryStream:
imageFactory.Load(image)
.Crop(cropLayer)
.Save(imageStream);
// Assign the processed image to the previously declared croppedImage:
croppedImage = Image.FromStream(imageStream);
}
}
// Return the cropped image:
return croppedImage;
}
如何避免多次实例化 imagefactory 和内存流,减少我的方法的大小并避免两次编写相同的代码?
解决方案
此类代码通常可以使用模板方法设计模式进行重构。在像这种只有一个部分变化的简单情况下,可以简化为仅将该部分作为参数传递,而不是采用完全继承方法:
public Image CloneViaStream(Image image,
Func<TypeFromImageFactoryLoad, TypeForSaveCall> populateStream)
{
using (var imageFactory = new ImageFactory(preserveExifData: true))
{
using (var imageStream = new MemoryStream())
{
TypeFromImageFactoryLoad loadResult = imageFactory.Load(image);
TypeForSaveCall processResult = process(loadResult);
processResult.Save(imageStream);
imageStream.Location = 0;
return Image.FromStream(imageStream);
}
}
}
并使用以下方法调用此方法:
var resultResize = CloneViaStream(image,
funcParam1 => funcParam1.Resize(new Size(width, height)));
var cropLayer = ...
var resultCrop = CloneViaStream(image,
loadResult => loadResult.Crop(cropLayer)));
Func<Image, Image>
如果您想对多个图像应用相同的转换,也可以返回。
请注意,这是否是一个好主意纯粹是个人喜好。在某种程度上,由于您的原始代码确实是错误的,因此最好将此类代码放在一个地方,因为您不需要使用imageStream.Location =0;
...更新多个方法,但另一方面它可能更难阅读。
推荐阅读
- android - 如何在firebase实时数据库中动态添加新节点
- stata - Stata 多项式回归 - 估计后 Wald 检验
- electron - Electronjs如何检测监视器/屏幕是否关闭
- reactjs - 未指定时如何在 React 组件中显式创建可选属性?
- javascript - 将 Class 应用程序转换为 React Next 应用程序的 Hooks
- docker - 用于环境版本控制的 Docker 映像存储库名称或标记
- django - 如何在 Django 中为 python 请求创建队列?
- eclipse - 使用 Eclipse Buildship 插件运行 gradle 构建任务时如何排除测试任务?
- c# - AdysTech/CredentialManager 删除凭据问题
- azure-functions - Azure 函数 - 获取 java.lang.IllegalStateException:与 cosmos 客户端连接时阻塞读取 120000 MILLISECONDS 时超时