LeftImage - 带有流畅界面的图像优化库
一个简单的库,用于保存、调整大小、缩放、裁剪和旋转上传的图像。
引言
这个库是我在 2008 年 1 月撰写的《Simple Image Resizing Library》的演进。处理和操作图像变得越来越普遍,因此我开发了这个库,以使这项工作更快、更容易。
背景
该库使用流畅的接口,使代码更具可读性和简洁性。流畅的接口也有助于展示可以链式组合的图像优化。虽然该库提供了许多节省时间和节省空间的功能,但它也有一些它不做的事情。例如,您需要处理验证和命名问题:图像是否太大?是否已经存在同名图像?等等。
使用代码
要使用该库,您将处理三个主要类之一:WebImage
、GenericImage
和 ZipImage
。当然,在处理从网站上传的图像时,应使用 WebImage
。WebImage
和 GenericImage
都可以直接操作图像,而 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
属性将返回保存图像的完整路径。这是一个**重要提示**:WebImage
或 GenericImage
上的大多数方法都是流畅的,而 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();
结论
以上是对该库的快速介绍。希望您觉得它有用。我希望将来能用更多功能(不透明度、水印、文本叠加等)更新它,并在完成时在此处发布。