65.9K
CodeProject 正在变化。 阅读更多。
Home

LeftImage - 带有流畅界面的图像优化库

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.57/5 (4投票s)

2009 年 12 月 28 日

CPOL

5分钟阅读

viewsIcon

33733

downloadIcon

948

一个简单的库,用于保存、调整大小、缩放、裁剪和旋转上传的图像。

组合操作的示例图像

引言

这个库是我在 2008 年 1 月撰写的《Simple Image Resizing Library》的演进。处理和操作图像变得越来越普遍,因此我开发了这个库,以使这项工作更快、更容易。

背景

该库使用流畅的接口,使代码更具可读性和简洁性。流畅的接口也有助于展示可以链式组合的图像优化。虽然该库提供了许多节省时间和节省空间的功能,但它也有一些它不做的事情。例如,您需要处理验证和命名问题:图像是否太大?是否已经存在同名图像?等等。

使用代码

要使用该库,您将处理三个主要类之一:WebImageGenericImageZipImage。当然,在处理从网站上传的图像时,应使用 WebImageWebImageGenericImage 都可以直接操作图像,而 ZipImage 可以从 Zip 文件中提取图像。

这个库可能还有一些工作要做,因此欢迎提出建议和推荐。

示例 1:单个图像,单个操作

在第一个示例中,我们假设我们刚刚发布到一个 ASPX 页面,并使用 FileUpload 控件选择要上传的图像。这段代码放在 ButtonSubmit_Click 方法中。

//create WebImage from the uploaded file
var img = new WebImage(fileUploader);
//change the path, so it gets saved in the "resize" directory
img.Path = "orig";
//save the image, this returns the "PathInfo" object
//which contains the actual path information
var fullImageInfo = img.Save();

//now create manipulated versions, and save them
var resize1 = img.Resize(300, null).Save("resize", "1_" + img.FileName);
var crop1 = img.Crop(300, 300, 
    CropAnchorPosition.Center).Save("crop", "1_" + img.FileName);
var rotate1 = img.Rotate(45, Color.White).Save(
                    "rotate", "1_" + img.FileName);
var scale1 = img.Scale(90).Save("scale", "1_" + img.FileName);

//now display the images
img1.ImageUrl = resize1.OriginalPath;
img2.ImageUrl = crop1.OriginalPath;
img3.ImageUrl = rotate1.OriginalPath;
img4.ImageUrl = scale1.OriginalPath;

现在,我们将逐行解释上面的示例。第一行使用上传的文件创建一个 WebImage。构造函数提取图像和信息,并返回一个填充的 WebImage 对象。

var img = new WebImage(fileUploader);

下一行将目录“orig”的路径设置为“orig”。这是我们要将上传的原始文件保存到的目录。请**注意**,您必须调整此目录的权限,以允许 .NET 进程写入它。

img.Path = "orig";

下一行简单地调用 WebImage 对象上可用的 Save 方法。因为我们没有传递任何参数,所以此方法将使用上传图像的现有文件名保存它。

var fullImageInfo = img.Save();

下一部分以一些图像操作开始。

第一行获取相同的 WebImage 对象,并调用“Resize”方法,仅将宽度(第一个参数)限制为 300 像素。第二个参数是最大高度,因此传递 null 将**不**限制高度。下一个调用将图像保存到“resize”目录,并在文件名中加上“1_”。

包含在示例项目中的调整大小结果

第二行调用“Crop”方法,将宽度和高度设置为 300 像素,并从图像中心裁剪。然后,它将文件保存到“crop”目录,并在文件名中加上“1_”。

包含在示例项目中的裁剪结果

第三行调用“Rotate”方法,将角度设置为 45,并将结果背景色设置为白色。然后,它将使用相同的约定进行保存。

包含在示例项目中的旋转结果

第四行调用“Scale”方法,将百分比设置为 90。然后,它也使用相同的约定进行保存。

包含在示例项目中的缩放结果
var resize1 = img.Resize(300, null).Save("resize", "1_" + img.FileName);
var crop1 = img.Crop(300, 300, CropAnchorPosition.Center).Save(
                     "crop", "1_" + img.FileName);
var rotate1 = img.Rotate(45, Color.White).Save("rotate", "1_" + img.FileName);
var scale1 = img.Scale(90).Save("scale", "1_" + img.FileName);

下一部分为图像控件设置 ImageUrl。由于上述代码块中的每个命令都以调用 Save 方法结束,因此每个结果对象都包含每个图像的 PathInfo 对象。使用 OriginalPath 属性将返回保存图像的完整路径。这是一个**重要提示**:WebImageGenericImage 上的大多数方法都是流畅的,而 Save 方法不是。

img1.ImageUrl = resize1.OriginalPath;
img2.ImageUrl = crop1.OriginalPath;
img3.ImageUrl = rotate1.OriginalPath;
img4.ImageUrl = scale1.OriginalPath;

示例 2:单个图像,链式操作

如果您想对一个图像执行多个操作怎么办?很简单,只需按您希望操作发生的顺序调用每个方法即可。

var combo1 = img.Resize(400, 250)
            .Crop(200, 200, CropAnchorPosition.Center)
            .Save("combo", "1_" + img.FileName);
var combo2 = img.Rotate(45, null)
            .Crop(200, 200, CropAnchorPosition.Center)
            .Rotate(90, null)
            .Crop(100, 100, CropAnchorPosition.Center)
            .Save("combo", "2_" + img.FileName);

对于这个例子,没有太多需要解释的了。由于使用了流畅的接口,方法的链式调用使其易于阅读和理解。

包含在示例项目中的组合操作结果

您也可以在一行代码中组合多个操作。

img.ProcessAndSave(new ImageInfo {MaxResizeWidth = 300, RotateAngle = 90});

在上面的示例中,ProcessAndSave 方法将 ImageInfo 对象作为参数。此示例使用对象初始化程序来设置最大调整大小宽度和旋转角度。

示例 3:单个图像,多个操作

通过为 ProcessAndSaveMultiple 方法提供 ImageInfo 对象列表,可以将上述示例进一步扩展。下面的示例将生成四个单独的图像,每个图像都按照 ImageInfo 对象中定义的样式进行操作。

var gallerySize = new ImageInfo {Path = "gallery", MaxResizeWidth = 600};
var featureSize = new ImageInfo {Path = "feature", MaxResizeHeight = 150};
var thumbnailSize = new ImageInfo {Path = "thumb", 
                    MaxResizeWidth = 100, MaxResizeHeight = 100};
var squareSmall = new ImageInfo
            {
              Path = "square",
              MaxResizeWidth = 75,
              MaxResizeHeight = 75,
              CropWidth = 50,
              CropHeight = 50
            };
img.ProcessAndSaveMultiple(new List<imageinfo> 
            {
                gallerySize, 
                featureSize, 
                thumbnailSize, 
                squareSmall
            });

示例 4:提取和优化 Zip 文件中的图像

该库还包含一个用于从 zip 文件中提取图像的实用程序。要从 zip 文件中提取图像,只需向 ZipImage 构造函数提供文件本身的 Stream 即可。

var zip = new ZipImage(fileUploader.PostedFile.InputStream);

//save multiple versions of each using the same ImageInfo objects in Example 3
zip.SaveAllMultiple(new List<imageinfo> {gallerySize, featureSize, 
                                            thumbnailSize, squareSmall});

在上面的示例的第一行中,我们仅向 ZipImage 构造函数提供了 Zip 文件的路径。这将加载 zip 文件并从中提取所有图像。

**注意**:此功能需要 SharpZip 库

var zip = new ZipImage(fileUploader.PostedFile.FileName);

第二行使用示例 3 中展示的技术,为从 zip 文件中提取的每个图像创建和保存多个操作后的图像。

zip.SaveAllMultiple(new List<imageinfo> {gallerySize, 
                    featureSize, thumbnailSize, squareSmall});

其他功能

以上就是使用 LeftImage 库的基础知识,但还有一些其他功能需要注意。您可能会问,如果您使用示例 3 和 4 中所示的技术上传和操作图像,如何访问创建的每个图像?很简单,使用 SavedImages 属性获取已保存图像的列表。如果遇到事务性过程中的错误,这可能特别有用。

//load and save images in zip file
try
{
    var zip = new ZipImage(fileUploader.PostedFile.FileName);
    zip.SaveAll();

    //loop through saved images, and create database record for each
    foreach (var image in zip.SavedImages)
    {
        //create 
        var p = new Photo();
        p.GalleryID = 11;        //For illustration purposes only
        p.PathToImage = string.Concat(image.Path, "/", image.FileName);
        p.Save();
    }
}
catch (Exception ex)
{
    //error occurred during save, so delete any images that were saved
    WebImage.Delete(zip.SavedImages);
}

LeftImage 库还通过使用扩展方法提供了更多快捷方式。

using LeftImage.Extensions;

//is the uploaded image actually an image?
var isSupported = fileUploader.IsSupportedFormat();

//process and save the images straight from the FileUpload variable
fileUploader.Process(new ImageInfo {Path = "pix", MaxResizeWidth = 300}).Save();

//do the same using the ProcessAndSave method
fileUploader.ProcessAndSave(new ImageInfo {Path = "pix", MaxResizeWidth = 300});

//call one manipulation from the FileUpload variable
fileUploader.Resize(100, null).Save();

//or chain them together
fileUploader.Resize(100, null).Crop(50, 50, CropAnchorPosition.Center).Save();

结论

以上是对该库的快速介绍。希望您觉得它有用。我希望将来能用更多功能(不透明度、水印、文本叠加等)更新它,并在完成时在此处发布。

© . All rights reserved.