首页 > 解决方案 > 是否有可能使这两种方法通用或至少分开?

问题描述

我在 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 和内存流,减少我的方法的大小并避免两次编写相同的代码?

标签: c#

解决方案


此类代码通常可以使用模板方法设计模式进行重构。在像这种只有一个部分变化的简单情况下,可以简化为仅将该部分作为参数传递,而不是采用完全继承方法:

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;...更新多个方法,但另一方面它可能更难阅读。


推荐阅读