Bitmap.Save方法中的GDI +中发生了一般性错误

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

我正在使用以下链接:

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

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

导致exception“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(); } 

当一个Bitmap对象或一个Image对象是从一个文件构造的时候,该文件在该对象的生存期内保持locking状态。 因此,您无法更改图像并将其保存回原来的相同文件。 http://support.microsoft.com/?id=814675

在GDI +,JPEG Image到MemoryStream中发生一般性错误

Image.Save(..)抛出一个GDI +exception,因为内存stream已closures

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

编辑:
只是从记忆中写…

保存到“中介”内存stream,应该工作

比如试试这个 – 更换

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

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

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

这是一种你迟早会后悔的编程风格。 只是敲门,你忘了一个。 你不是在处理newBitmap 。 它在文件上保持locking,直到垃圾收集器运行。 如果它没有运行,那么你第二次尝试保存到同一个文件,你会得到klaboom。 GDI +的例外情况太糟糕了,以至于不能提供良好的诊断信息,所以严重的头部搔抓随之而来。 除了数千个提到这个错误的可search的职位之外。

始终有利于使用using语句。 即使代码抛出一个exception,也不会忘记放置一个对象。

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

虽然目前还不清楚为什么你甚至要创build一个新的位图,但是保存thumbBMP应该已经足够好了。 Anyhoo,使用爱给其余的一次性物品相同。

检查你的文件夹的权限图像保存右c文件夹然后去:

属性“>”安全性“>”编辑“>”添加“ – select”所有人“,然后选中”允许“

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

  1. validation目标文件夹是否存在
  2. validation目标文件夹中是否已经有相同名称的文件

我正面临着同样的问题在GDI +上工作在MVC应用程序的保存时发生了一般性错误 ,我得到这个错误,因为我写错误的path来保存图像,我更正了保存path ,它对我工作正常。

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

我得到它使用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); 

在硬盘上创build文件夹path图像/大拇指=>问题解决!

对我来说这是一个许可问题。 有人删除了运行该应用程序的用户帐户的文件夹的写入权限。

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

我尝试将TIFF图像转换为Jpeg时遇到此错误。 对我来说,这个问题源于tiff尺寸太大。 高达62000像素的任何东西都很好,超过这个尺寸的任何东西都会产生错误。

我总是检查/testing这些:

  • path + filename是否包含给定文件系统的非法字符?
  • 文件是否已经存在? (坏)
  • path是否已经存在? (好)
  • 如果path是相对的:我期待它在正确的父目录(主要是bin/Debug ;-))?
  • 程序的path是否可写,以及哪个用户运行? (服务在这里可能很棘手!)
  • 真正的道路是否真的不包含非法字符? (一些unicode字符接近隐形)

除了这个列表,我从来没有任何问题Bitmap.Save()