从System.Drawing.Image在文件系统上创建一个新图像?

one*_*ney 3 c# asp.net gdi+ thumbnails image-resizing

好的,对不起,这可能是一个noob问题,但我有点卡住了.

所以我正在做的(在我的asp.net应用程序上)是从文件系统加载图像:

System.Drawing.Image tempImage;
tempImage = System.Drawing.Image.FromFile(HttpContext.Server.MapPath(originalPath));
Run Code Online (Sandbox Code Playgroud)

然后我做了一些调整大小:

tempImage = my awesomeResizingFunction(tempImage, newSize);
Run Code Online (Sandbox Code Playgroud)

并打算使用以下方法将其保存到另一个位置的文件系统:

string newPath = "/myAwesomePath/newImageName.jpg";
tempImage.Save(newPath);
Run Code Online (Sandbox Code Playgroud)

而我得到的是这个错误:

"A generic error occurred in GDI+."
Run Code Online (Sandbox Code Playgroud)

我知道图像是"正常的",因为我可以将它写入浏览器并查看已调整大小的图像,我只是在尝试保存时才收到错误.我有点新手,我完全错了吗?(嗯,我猜这很明显,但你知道我的意思......)

Muh*_*tar 7

请尝试此代码...我使用了相同的代码来调整图像和保存.如果你有任何问题,请告诉我.

System.Drawing.Bitmap bmpOut = new System.Drawing.Bitmap(NewWidth, NewHeight);
    System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bmpOut);
    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
    g.FillRectangle(System.Drawing.Brushes.White, 0, 0, NewWidth, NewHeight);
    g.DrawImage(new System.Drawing.Bitmap(fupProduct.PostedFile.InputStream), 0, 0, NewWidth, NewHeight);
    MemoryStream stream = new MemoryStream();
    switch (fupProduct.FileName.Substring(fupProduct.FileName.IndexOf('.') + 1).ToLower())
    {
        case "jpg":
            bmpOut.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
            break;
        case "jpeg":
            bmpOut.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
            break;
        case "tiff":
            bmpOut.Save(stream, System.Drawing.Imaging.ImageFormat.Tiff);
            break;
        case "png":
            bmpOut.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
            break;
        case "gif":
            bmpOut.Save(stream, System.Drawing.Imaging.ImageFormat.Gif);
            break;
    }
    String saveImagePath = Server.MapPath("../") + "Images/Thumbnail/" + fupProduct.FileName.Substring(fupProduct.FileName.IndexOf('.'));
    bmpOut.Save(saveImagePath);
Run Code Online (Sandbox Code Playgroud)

其中fupProduct是fileupload控件ID


Tho*_*que 5

您确定 originalPath 和 newPath 指向不同的文件吗?当您使用 Image.FromFile 时,该文件将保持锁定状态,直到您对 Image 调用 Dispose,这可能会导致您提到的异常。你可以像这样加载图像:

Image tempImage = null;
using (FileStream fs = new FileStream(originalPath, FileMode.Open, FileAccess.Read))
{
    tempImage = Image.FromStream(fs);
}
...
Run Code Online (Sandbox Code Playgroud)

这种方法保证文件在 using 块结束时关闭