Сохранил бы только измененные изображения

Я хочу, чтобы он сохранял только изображения с измененным размером, поэтому попытался это сделать. Он снова удаляет исходное изображение после его загрузки, но не может, потому что говорит, что изображение используется другим процессом. Пожалуйста, помогите.
Невозможно просто удалить место хранения оригинала, потому что он использует его для изменения размера.

Я использую этот код для сохранения файлов:

string tempPath = "Galleryt";
string imgPath = "Gallery";
string savePath =  Path.Combine(Request.PhysicalApplicationPath, tempPath);
string imgSavePath = Path.Combine(Request.PhysicalApplicationPath, imgPath);
string imgSavePath2 = Path.Combine(Request.PhysicalApplicationPath, imgPath);
string ProductImageNormal = Path.Combine(imgSavePath, imageName + Fileupload1.PostedFile.FileName);
string ProductImagetemp = Path.Combine(savePath, "t__" + imageName + Fileupload1.PostedFile.FileName);
string ProductImagetemp2 = Path.Combine(imgSavePath2, "b__" + imageName + Fileupload1.PostedFile.FileName);
string extension = Path.GetExtension(Fileupload1.PostedFile.FileName);

switch (extension.ToLower())
{
    case ".png": goto case "Upload";
    case ".gif": goto case "Upload";
    case ".jpg": goto case "Upload";
    case "Upload": Fileupload1.PostedFile.SaveAs(ProductImageNormal);
        ImageTools.GenerateThumbnail(ProductImageNormal, ProductImagetemp, 250, 350, true, "heigh");
        ImageTools.GenerateThumbnail(ProductImageNormal, ProductImagetemp2, 600, 600, true, "heigh");

        Label1.Text = "";
        break;
    default:
        Label1.Text = "Status: Denne filtype er ikke tilladt";
        return;

}

если я попытаюсь удалить исходный файл сразу после кода

   File.Delete(Server.MapPath("~/Gallery/" + imageName + Fileupload1.PostedFile.FileName));

метод GenerateThumbnail

  public static void GenerateThumbnail(string filePath, string OriginalFile, int width, int height, bool retainAspect, string quality)
{
    Bitmap bitmapNew;
    float fx, fy, f;
    int widthTh, heightTh;
    int widthOrig, heightOrig;
    bitmapNew = new Bitmap(filePath);

    if (retainAspect)
    {
        widthOrig = bitmapNew.Width;
        heightOrig = bitmapNew.Height;
        fx = widthOrig / width;
        fy = heightOrig / height;
        f = Math.Max(fx, fy);

        if (f<1)
        {
            f=1;
        }
        widthTh = (int)(widthOrig/f);
        heightTh = (int)(heightOrig/f);
    }
    else
    {
        widthTh = width;
        heightTh = height;


    }

    Size newSize = new Size(widthTh, heightTh);

    using(Bitmap thumb = new Bitmap((System.Drawing.Image)bitmapNew, newSize))
    {
        Graphics g = Graphics.FromImage(thumb);
        Int64 qualityLevel = 25L;

        if (quality == "high")
        {
             g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
             g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
             g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
             qualityLevel = 95L;
        }
        if (quality == "medium" || quality == "low")
        {
             g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
             g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Low;
             g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighSpeed;
            if (quality =="medium")
                qualityLevel = 65L;

        }
        System.Drawing.Imaging.ImageCodecInfo codec = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders()[1];
        System.Drawing.Imaging.EncoderParameters eParams = new System.Drawing.Imaging.EncoderParameters(1);
        eParams.Param[0]=new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qualityLevel);
        //Her genereres den nye thumbnail
        thumb.Save(OriginalFile, codec, eParams);
        thumb.Dispose();
    }
}

person saadan    schedule 26.05.2010    source источник


Ответы (2)


Проблема находится в коде, который мы не видим, GenerateThumbnail(). Предполагая, как это может работать, он создает растровое изображение из ProductImageNormal. Это блокирует файл, предотвращая его удаление. Вам нужно будет вызвать метод Dispose() растрового изображения, чтобы снять блокировку.

person Hans Passant    schedule 26.05.2010

Если метод ImageTools.GenerateThumbnail может принимать Stream, подумайте о том, чтобы записать PostedFile в [MemoryStream][1] и передать его этому методу перед сохранением эскизов или даже использовать PostedFile.InputStream напрямую, если это возможно. Таким образом, исходное изображение всегда находится только в памяти, и вы даже не сохраняете его на диск.

person Oded    schedule 26.05.2010
comment
Я согласен, я предполагаю, что класс ImageTools использует Image i = Image.FromFile(...) и не вызывает i.Dispose() после завершения. - person Fredrik Johansson; 26.05.2010
comment
Могу ли я отключить функцию так, как файл выпуска? Спасибо - person saadan; 26.05.2010
comment
@saadan - я не понимаю. - person Oded; 26.05.2010