图像调整器 - 如果图像小于请求的大小,则不重新保存图像



好的,我正在尝试使用ImageResizer组件在我的web应用程序。我有以下代码:

var versions = new Dictionary<string, string>();
//Define the versions to generate
versions.Add("_001", "maxwidth=300&maxheight=300&format=jpg");
versions.Add("_002", "maxwidth=600&maxheight=600&format=jpg");
versions.Add("_003", "maxwidth=1920&maxheight=1080&format=jpg&process=no"); // I expect it not to resave the image if original is smaller
string uploadFolder = "...my folder path...";
if (!Directory.Exists(uploadFolder))
    Directory.CreateDirectory(uploadFolder);
//Generate each version
foreach (string suffix in versions.Keys)
{
    //Generate a filename (GUIDs are best).
    string fileName = Path.Combine(uploadFolder, DEFAULT_IMAGE_NAME + suffix);
    //Let the image builder add the correct extension based on the output file type
    fileName = ImageBuilder.Current.Build(file, fileName, new ResizeSettings(versions[suffix]), false, true);
}
file.SaveAs(uploadFolder + DEFAULT_IMAGE_NAME + "_000.jpg");

正如你可以告诉我保存一个图像+原始图像的3个版本。然而,我只希望图像被重新编码和重新保存,如果需要调整大小。因此,如果我上传1000x1000的图像,我希望main_000.jpg和main_003.jpg是相同的。然而,情况并非如此(ImageResizer也会调整图像的大小,并且通常保存的文件大小大于main_000.jpg)。

我试着添加process=no作为参数,但它不起作用。有人知道这个场景是否支持,我需要添加哪个参数吗?

//it may need to be improved
    Dictionary<string, SavingSettings> SaveVersions = new Dictionary<string, SavingSettings>();
    public void page_load(object sender, EventArgs e) {
        //set versions:
        SaveVersions.Add("xxl", new SavingSettings("xxl", new ImageResizer.ResizeSettings())); //original size
        SaveVersions.Add("600px", new SavingSettings("600px", new ImageResizer.ResizeSettings(600, 600, ImageResizer.FitMode.Max, "jpg"))); //big
        SaveVersions.Add("80px", new SavingSettings("80px", new ImageResizer.ResizeSettings(80, 80, ImageResizer.FitMode.Max, "jpg"))); //80 px thumb
        SaveVersions.Add("260w", new SavingSettings("260w", new ImageResizer.ResizeSettings(260, 0, ImageResizer.FitMode.Max, "jpg"))); //260 px width thumb
    }
    public void SaveIt(string SourceFile,string TargetFileName) {
        using(System.Drawing.Bitmap bmp = ImageResizer.ImageBuilder.Current.LoadImage(SourceFile, new ImageResizer.ResizeSettings())) {
            foreach(System.Collections.Generic.KeyValuePair<string, SavingSettings> k in SaveVersions) {
                string TargetFilePath = Server.MapPath("../img/" + k.Value.VersionName + "/" + TargetFileName + ".jpg");
                string TargetFolder = Server.MapPath("../img/" + k.Value.VersionName);
                if(!System.IO.Directory.Exists(TargetFolder)) System.IO.Directory.CreateDirectory(TargetFolder);
                if(bmp.Width > k.Value.ResizeSetting.Width || bmp.Height > k.Value.ResizeSetting.Height) {
                    //you may need to resize
                    ImageResizer.ImageBuilder.Current.Build(bmp, TargetFilePath, k.Value.ResizeSetting, false);
                } else {
                    //just copy it
                    //or in your example you can save uploaded file
                    System.IO.File.Copy(SourceFile, TargetFilePath);
                }
            }
        }
    }
    struct SavingSettings {
        public string VersionName;
        public ImageResizer.ResizeSettings ResizeSetting;
        public SavingSettings(string VersionName, ImageResizer.ResizeSettings ResizeSetting) {
            this.VersionName = VersionName;
            this.ResizeSetting = ResizeSetting;
        }
    }

你需要使用URL API,而不是托管API,来执行动态图像调整。

只需去掉预调整大小的代码,并将上传的文件保存到磁盘(但是,请确保对文件名进行了消毒或使用GUID代替)。

然后,像这样使用URL API:
<img src="/uploads/original.jpg?maxwidth=300&maxheight=300&format=jpg" />