只会保存已调整大小的图像

时间:2010-05-26 06:36:11

标签: c# image resize

我希望它只保存已调整大小的图像,所以试图这样做。它在上传后再次删除原始图像,但不能,因为它表示图像正被另一个进程使用。请帮忙。
不能简单地删除它存储原件的位置,因为它使用它来调整大小。

我使用此代码保存文件:

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

2 个答案:

答案 0 :(得分:1)

如果ImageTools.GenerateThumbnail方法可以使用Stream,请考虑将PostedFile写入[MemoryStream][1]并在保存缩略图之前将其传递给此方法,或者甚至使用如果可能的话,直接PostedFile.InputStream。这样原始图像只存在于内存中,甚至不会将其保存到磁盘中。

答案 1 :(得分:1)

问题出在我们看不到的代码GenerateThumbnail()中。猜测它可能的工作方式,它会从ProductImageNormal创建一个位图。这会锁定文件,从而阻止它被删除。你必须调用位图的Dispose()方法来释放锁。