1

OK、Web アプリでImageResizer コンポーネントを使用しようとしています。私は次のコードを持っています:

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

ご覧のとおり、1 つの画像 + 元の画像の 3 つのバージョンを保存しています。ただし、サイズ変更が必要な場合にのみ、画像を再エンコードして再保存する必要があります。したがって、1000x1000 の画像をアップロードすると、main_000.jpg と main_003.jpg が同じであることが期待されます。ただし、そうではありません (ImageResizer はその画像のサイズも変更し、多くの場合、保存されるファイル サイズは main_000.jpg よりも大きくなります)。

パラメータとして process=no を追加しようとしましたが、機能していません。このシナリオがサポートされているかどうか、およびどのパラメーターを追加する必要があるかを知っている人はいますか?

4

2 に答える 2

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;
        }
    }
于 2013-03-01T23:01:01.137 に答える
1

動的な画像のサイズ変更を実行するには、Managed API ではなく、URL API を使用する必要があります。

サイズ変更前のコードを取り除き、アップロードをディスクに保存します (ただし、ファイル名をサニタイズするか、代わりに GUID を使用してください)。

次に、次のように URL API を使用します。

<img src="/uploads/original.jpg?maxwidth=300&maxheight=300&format=jpg" />
于 2013-03-01T22:58:43.673 に答える