Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: saadanОтветов: 2

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

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

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();
    }
}

imageresize

Ответы

Ответ 1 · рейтинг 1 · Hans Passant

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

Ответ 2 · рейтинг 1 · Oded

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы