Общая ошибка произошла в GDI + в методе Bitmap.Save

Я работаю над загрузкой и сохранением уменьшенной копии этого изображения в папке с миниатюрами.

Я использую следующую ссылку:

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

Когда либо объект Bitmap, либо объект Image сконструирован из файла, файл остается заблокированным для времени жизни объекта. В результате вы не можете изменить изображение и сохранить его обратно в тот же файл, в котором он был создан. http://support.microsoft.com/?id=814675

Общая ошибка произошла в GDI +, JPEG-изображении в MemoryStream

Image.Save (..) генерирует исключение GDI +, поскольку stream памяти закрыт

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() , недействителен (папка не существует и т. Д.).

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

Это стиль программирования, о котором вы скоро пожалеете. Рано стучится в дверь, вы забыли ее. Вы не используете newBitmap . Которая сохраняет блокировку файла до тех пор, пока не будет запущен сборщик мусора. Если он не запускается, то во второй раз, когда вы пытаетесь сохранить в тот же файл, вы получите klaboom. Исключения GDI + слишком ничтожны, чтобы дать хорошую диагностику, так что возникает серьезная царапина на голове. За тысячами поисковых сообщений, в которых упоминается эта ошибка.

Всегда пользуйтесь использованием инструкции using . Который никогда не забывает распоряжаться объектом, даже если код генерирует исключение.

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

Хотя очень непонятно, почему вы даже создаете новое bitmap, сохранение thumbBMP должно быть уже достаточно хорошим. Anyhoo, дайте остальным вашим одноразовым объектам одинаковое использование любви.

Проверьте разрешение вашей папки, где будет сохранено изображение. Щелкните правой кнопкой мыши в папке, затем выберите:

Свойства> Безопасность> Изменить> Добавить – выберите «все» и установите флажок «Разрешить полный контроль».

В моем случае файл растрового изображения уже существовал на системном диске , поэтому мое приложение выбросило ошибку «Общая ошибка, произошедшая в GDI +» .

  1. Убедитесь, что папка назначения существует
  2. Убедитесь, что в папке назначения еще нет файла с тем же именем

Я столкнулся с той же проблемой . Общая ошибка, произошедшая в GDI + при сохранении при работе с MVC-приложением, я получал эту ошибку, потому что я писал неправильный путь для сохранения изображения, я исправил путь сохранения, и это сработало для меня.

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

Я всегда проверяю / проверяю:

  • Имеет ли путь + имя файла недопустимые символы для данной файловой системы?
  • Файл уже существует? (Плохо)
  • Этот путь уже существует? (Хорошо)
  • Если путь относительный: я ожидаю его в правильном родительском каталоге (в основном bin/Debug ;-))?
  • Является ли путь доступным для программы и каким пользователем он запускается? (Услуги могут быть сложными здесь!)
  • Действительно ли полный путь действительно не содержит незаконных символов? (некоторые символы Unicode близки к невидимым)

У меня никогда не было проблем с Bitmap.Save() кроме этого списка.

Я работал с 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); 

Создать путь к папке / превью на жесткий диск => Проблема решена!

Для меня это была проблема разрешения. Кто-то удалил права на запись в папку для учетной записи пользователя, под которой было запущено приложение.

  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. Для меня проблема связана с большими размерами размеров. Все, что было около 62000 пикселей, было прекрасным, что-то выше этого размера вызвало ошибку.

для меня это было проблемой при сохранении изображения.

 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.... 

Надеюсь, что кто-то застрял!

Interesting Posts

Вычисление размера массива

Как я могу зарегистрировать глобальный настраиваемый редактор в Spring-MVC?

Как показать TCP-прослушивание и фильтровать их по локальному IP-адресу в Windows?

Не удалось создать Android-устройство Android, «Нет системного образа для этой цели»

Какую версию окна можно виртуализировать?

Исключенное исключение SQL для JDBC

Как установить текст в EditText

Как использовать «ng-repeat» в шаблоне директивы в Angular JS?

Загрузка в Windows с USB-накопителя, созданного на OSX

Создайте список содержимого ячейки, разделенный запятыми, за исключением пробелов

Невозможно создать прозрачный и незадекларированный JFrame в JDK7 при включении nimbus

Разница между UTF-8 и UTF-16?

Как провести тест производительности моего интернет-соединения?

Почему порядок альтернатив имеет значение в регулярном выражении?

Что означает servletcontext.getRealPath (“/”) и когда я должен его использовать

Давайте будем гением компьютера.