在GDI +中Bitmap.Save方法发生了一般性错误(A Generic error occur

2019-08-20 03:52发布

我正在上传并保存图像的缩略图副本的缩略图文件夹中。

我使用以下链接:

http://weblogs.asp.net/markmcdonnell/archive/2008/03/09/resize-image-before-uploading-to-server.aspx

newBMP.Save(directory + "tn_" + filename);   

导致异常“GDI +中发生一般性错误。”

我试图赋予权限的文件夹中,也试图保存时使用一个新的独立的BMP对象。

编辑:

    protected void ResizeAndSave(PropBannerImage objPropBannerImage)
    {
        // Create a bitmap of the content of the fileUpload control in memory
        Bitmap originalBMP = new Bitmap(fuImage.FileContent);

        // Calculate the new image dimensions
        int origWidth = originalBMP.Width;
        int origHeight = originalBMP.Height;
        int sngRatio = origWidth / origHeight;
        int thumbWidth = 100;
        int thumbHeight = thumbWidth / sngRatio;

        int bannerWidth = 100;
        int bannerHeight = bannerWidth / sngRatio;

        // Create a new bitmap which will hold the previous resized bitmap
        Bitmap thumbBMP = new Bitmap(originalBMP, thumbWidth, thumbHeight);
        Bitmap bannerBMP = new Bitmap(originalBMP, bannerWidth, bannerHeight);

        // Create a graphic based on the new bitmap
        Graphics oGraphics = Graphics.FromImage(thumbBMP);
        // Set the properties for the new graphic file
        oGraphics.SmoothingMode = SmoothingMode.AntiAlias; oGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic;

        // Draw the new graphic based on the resized bitmap
        oGraphics.DrawImage(originalBMP, 0, 0, thumbWidth, thumbHeight);

        Bitmap newBitmap = new Bitmap(thumbBMP);
        thumbBMP.Dispose();
        thumbBMP = null;

        // Save the new graphic file to the server
        newBitmap.Save("~/image/thumbs/" + "t" + objPropBannerImage.ImageId, ImageFormat.Jpeg);

        oGraphics = Graphics.FromImage(bannerBMP);
        // Set the properties for the new graphic file
        oGraphics.SmoothingMode = SmoothingMode.AntiAlias; oGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic;

        // Draw the new graphic based on the resized bitmap
        oGraphics.DrawImage(originalBMP, 0, 0, bannerWidth, bannerHeight);
        // Save the new graphic file to the server
        bannerBMP.Save("~/image/" + objPropBannerImage.ImageId + ".jpg");


        // Once finished with the bitmap objects, we deallocate them.
        originalBMP.Dispose();

        bannerBMP.Dispose();
        oGraphics.Dispose();
    }

Answer 1:

当任一个位图对象或图像对象是从一个文件构成,该文件保持锁定状态的对象的生存期。 其结果是,你不能改变的图像,并将其保存回到它起源于同一个文件。 http://support.microsoft.com/?id=814675

GDI +中发生一般性错误,JPEG图像到的MemoryStream

Image.Save(..)抛出一个GDI +异常,因为存储器流被关闭

http://alperguc.blogspot.in/2008/11/c-generic-error-occurred-in-gdi.html

编辑:
从内存中只是写...

保存到“中介”记忆流,应该工作

例如,尝试这一个 - 替换

    Bitmap newBitmap = new Bitmap(thumbBMP);
    thumbBMP.Dispose();
    thumbBMP = null;
    newBitmap.Save("~/image/thumbs/" + "t" + objPropBannerImage.ImageId, ImageFormat.Jpeg);

喜欢的东西:

string outputFileName = "...";
using (MemoryStream memory = new MemoryStream())
{
    using (FileStream fs = new FileStream(outputFileName, FileMode.Create, FileAccess.ReadWrite))
    {
        thumbBMP.Save(memory, ImageFormat.Jpeg);
        byte[] bytes = memory.ToArray();
        fs.Write(bytes, 0, bytes.Length);
    }
}


Answer 2:

如果传递的路径也显示此错误消息Bitmap.Save()是无效的(文件夹不存在等)。



Answer 3:

    // Once finished with the bitmap objects, we deallocate them.
    originalBMP.Dispose();

    bannerBMP.Dispose();
    oGraphics.Dispose();

这是一个编程风格,你迟早会后悔的。 迟早是敲门,你忘了一个。 您还没有处置newBitmap。 这使该文件,直到垃圾收集器运行的锁。 如果它不然后运行你第二次尝试保存到同一个文件,你会得到klaboom。 GDI +的例外是太惨给出很好的诊断这么严重的头划伤随之而来。 除了数千提到这个错误googlable职位。

总是青睐使用using语句。 从未忘记处置的对象,即使代码抛出异常。

using (var newBitmap = new Bitmap(thumbBMP)) {
    newBitmap.Save("~/image/thumbs/" + "t" + objPropBannerImage.ImageId, ImageFormat.Jpeg);
}

虽然,这是很不清楚为什么你甚至创建一个新的位图,保存thumbBMP应该已经足够好了。 安美居,让您一次性对象的其余部分使用相同的爱。



Answer 4:

检查在图像保存在文件夹右键单击,然后去你的文件夹的权限:

属性>安全>编辑> Add--选择“每个人”,并选中允许“完全控制”



Answer 5:

在我的情况下,位图图像文件系统驱动器已经存在 ,所以我的应用程序抛出的错误“在GDI +发生一般性错误”。

  1. 确认目标文件夹是否存在
  2. 验证有没有与目标文件夹同名的文件


Answer 6:

我面临着同样的问题在MVC应用程序工作时,我得到这个错误,因为我在写错误的道路保存图像GDI +中发生了节约一般性错误 ,我纠正保存路径 ,它为我工作得很好。

img1.Save(Server.MapPath("/Upload/test.png", System.Drawing.Imaging.ImageFormat.Png);


--Above code need one change, as you need to put close brackets on Server.MapPath() method after writing its param.

像这样-

img1.Save(Server.MapPath("/Upload/test.png"), System.Drawing.Imaging.ImageFormat.Png);


Answer 7:

我懂了工作使用的FileStream,从这些获得帮助
http://alperguc.blogspot.in/2008/11/c-generic-error-occurred-in-gdi.html http://csharpdotnetfreak.blogspot.com/2010/02/resize-image-upload-ms-sql -database.html

System.Drawing.Image imageToBeResized = System.Drawing.Image.FromStream(fuImage.PostedFile.InputStream);
        int imageHeight = imageToBeResized.Height;
        int imageWidth = imageToBeResized.Width;
        int maxHeight = 240;
        int maxWidth = 320;
        imageHeight = (imageHeight * maxWidth) / imageWidth;
        imageWidth = maxWidth;

        if (imageHeight > maxHeight)
        {
            imageWidth = (imageWidth * maxHeight) / imageHeight;
            imageHeight = maxHeight;
        }

        Bitmap bitmap = new Bitmap(imageToBeResized, imageWidth, imageHeight);
        System.IO.MemoryStream stream = new MemoryStream();
        bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
        stream.Position = 0;
        byte[] image = new byte[stream.Length + 1];
        stream.Read(image, 0, image.Length);
        System.IO.FileStream fs
= new System.IO.FileStream(Server.MapPath("~/image/a.jpg"), System.IO.FileMode.Create
, System.IO.FileAccess.ReadWrite);
            fs.Write(image, 0, image.Length);


Answer 8:

我总是检查/测试这些:

  • 是否路径+文件名包含给定文件系统的非法字符?
  • 是否该文件已经存在? (坏)
  • 这条小路已经存在? (好)
  • 如果路径是相对的:我会期待它在正确的父目录(大多bin/Debug ;-))?
  • 是程序的路径可写,作为用户它运行? (服务可能会非常棘手这里!)
  • 是否完整路径真的,真的不包含非法字符? (一些unicode字符接近无形)

我从未有过任何问题Bitmap.Save()除了这个名单。



Answer 9:

创建文件夹路径图像/硬盘上的拇指=>问题解决了!



Answer 10:

对我来说这是一个权限问题。 有人取消了在其下的应用程序正在运行的用户帐户的文件夹的写权限。



Answer 11:

    I used below logic while saving a .png format. This is to ensure the file is already existing or not.. if exist then saving it by adding 1 in the filename

Bitmap btImage = new Bitmap("D:\\Oldfoldername\\filename.png");
    string path="D:\\Newfoldername\\filename.png";
            int Count=0;
                if (System.IO.File.Exists(path))
                {
                    do
                    {
                        path = "D:\\Newfoldername\\filename"+"_"+ ++Count + ".png";                    
                    } while (System.IO.File.Exists(path));
                }

                btImage.Save(path, System.Drawing.Imaging.ImageFormat.Png);


Answer 12:

而试图TIFF图像转换为JPEG我遇到了这个错误。 对我来说,这个问题从TIFF朵朵尺寸过大。 凡是达到约62000像素是罚款,这东西规模以上产生的误差。



Answer 13:

对我来说,保存图像时是一个路径问题。

int count = Directory.EnumerateFiles(System.Web.HttpContext.Current.Server.MapPath("~/images/savedimages"), "*").Count();

var img = Base64ToImage(imgRaw);

string path = "images/savedimages/upImages" + (count + 1) + ".png";

img.Save(Path.Combine(System.Web.HttpContext.Current.Server.MapPath(path)));

return path;

所以我加入固定它下面的正斜杠

String path = "images/savedimages....

应该

String path = "/images/savedimages....

希望可以帮助任何人卡住!



Answer 14:

我有相同异常的不同问题。

简而言之:

确保Bitmap的对象Stream不被调用之前布置.Save

全文:

有对返回的方法Bitmap对象,从内置MemoryStream通过以下方式:

private Bitmap getImage(byte[] imageBinaryData){
    .
    .
    .
    Bitmap image;
    using (var stream = new MemoryStream(imageBinaryData))
    {
        image = new Bitmap(stream);
    }
    return image;
}

然后有人用返回的图像保存为一个文件

image.Save(path);

问题是,试图保存图像时,抛出GDI + exeption原始流已经配置。

一个修复这个问题是返回Bitmap不设置流本身,但返回的Bitmap对象。

private Bitmap getImage(byte[] imageBinaryData){
   .
   .
   .
   Bitmap image;
   var stream = new MemoryStream(imageBinaryData))
   image = new Bitmap(stream);

   return image;
}

然后:

using (var image = getImage(binData))
{
   image.Save(path);
}


Answer 15:

从MSDN: public void Save (string filename); 这是相当令人惊讶的我,因为我们不只是在文件名通过,我们必须通过文件名以例如沿路径: MyDirectory/MyImage.jpeg ,这里MyImage.jpeg实际上并不存在呢,但我们的文件将保存这个名字。

这里的另一个重要的一点是,如果你使用的Save()在Web应用程序,然后使用Server.MapPath()与它基本上只是返回它在喜欢的东西,通过虚拟路径的物理路径一起。 image.Save(Server.MapPath("~/images/im111.jpeg"));



文章来源: A Generic error occurred in GDI+ in Bitmap.Save method