nikib3ro
nikib3ro

Reputation: 20606

ImageResizer - not resaving image if it's smaller than requested size

OK, I am trying to use ImageResizer component in my web app. I have following code:

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");

As you can tell I am saving 3 versions of one image + original image. However, I only want image to be re-encoded and re-saved if resizing is required. So if I upload 1000x1000 image I would expect that main_000.jpg and main_003.jpg are the same. However, that's not the case (ImageResizer resizes that image also, and often saved file size is bigger than main_000.jpg).

I tried adding process=no as parameter but it's not working. Anyone knows if this scenario is supported and which parameter I need to add?

Upvotes: 1

Views: 1627

Answers (2)

//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;
        }
    }

Upvotes: 2

Lilith River
Lilith River

Reputation: 16468

You need to use the URL API, not the Managed API, to perform dynamic image resizing.

Just get rid of the pre-resizing code, and save the upload to disk (make sure you sanitize the filename or use a GUID instead, however).

Then, use the URL API like this:

<img src="/uploads/original.jpg?maxwidth=300&maxheight=300&format=jpg" />

Upvotes: 1

Related Questions