I am working on to upload and save a thumbnail copy of that image in a thumbnail folder.
I am using following link:
http://weblogs.asp.net/markmcdonnell/archive/2008/03/09/resize-image-before-uploading-to-server.aspx
but
newBMP.Save(directory + "tn_" + filename);
is causing exception «A generic error occurred in GDI+.»
I have tried to give permission on folder, also tried to use a new separate bmp object when saving.
Edit:
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();
}
Cœur
36.4k25 gold badges191 silver badges258 bronze badges
asked Apr 7, 2013 at 13:18
0
When either a Bitmap object or an Image object is constructed from a
file, the file remains locked for the lifetime of the object. As a
result, you cannot change an image and save it back to the same file
where it originated.
http://support.microsoft.com/?id=814675
A generic error occurred in GDI+, JPEG Image to MemoryStream
Image.Save(..) throws a GDI+ exception because the memory stream is closed
http://alperguc.blogspot.in/2008/11/c-generic-error-occurred-in-gdi.html
EDIT:
just writing from memory…
save to an ‘intermediary’ memory stream, that should work
e.g. try this one — replace
Bitmap newBitmap = new Bitmap(thumbBMP);
thumbBMP.Dispose();
thumbBMP = null;
newBitmap.Save("~/image/thumbs/" + "t" + objPropBannerImage.ImageId, ImageFormat.Jpeg);
with something like:
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);
}
}
answered Apr 7, 2013 at 13:26
5
This error message is displayed if the path you pass to Bitmap.Save()
is invalid (folder doesn’t exist etc).
answered May 16, 2014 at 13:06
Reg EditReg Edit
6,4711 gold badge34 silver badges44 bronze badges
1
// Once finished with the bitmap objects, we deallocate them.
originalBMP.Dispose();
bannerBMP.Dispose();
oGraphics.Dispose();
This is a programming style that you’ll regret sooner or later. Sooner is knocking on the door, you forgot one. You are not disposing newBitmap. Which keeps a lock on the file until the garbage collector runs. If it doesn’t run then the second time you try to save to the same file you’ll get the klaboom. GDI+ exceptions are too miserable to give a good diagnostic so serious head-scratching ensues. Beyond the thousands of googlable posts that mention this mistake.
Always favor using the using statement. Which never forgets to dispose an object, even if the code throws an exception.
using (var newBitmap = new Bitmap(thumbBMP)) {
newBitmap.Save("~/image/thumbs/" + "t" + objPropBannerImage.ImageId, ImageFormat.Jpeg);
}
Albeit that it is very unclear why you even create a new bitmap, saving thumbBMP should already be good enough. Anyhoo, give the rest of your disposable objects the same using love.
answered Apr 7, 2013 at 14:04
Hans PassantHans Passant
913k145 gold badges1671 silver badges2507 bronze badges
0
In my case the bitmap image file already existed in the system drive, so my app threw the error «A Generic error occured in GDI+».
- Verify that the destination folder exists
- Verify that there isn’t already a file with the same name in the destination folder
answered Aug 14, 2014 at 7:56
PalanikumarPalanikumar
6,8584 gold badges40 silver badges51 bronze badges
Check your folder’s permission where the image is saved
Right cLick on folder then go :
Properties > Security > Edit > Add— select «everyone» and check Allow «Full Control»
answered Dec 3, 2015 at 11:52
AsadAsad
3494 silver badges5 bronze badges
1
I was facing the same issue A generic error occurred in GDI+ on saving while working on MVC app, I was getting this error because I was writing wrong path to save image, I corrected saving path and it worked fine for me.
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.
Like this-
img1.Save(Server.MapPath("/Upload/test.png"), System.Drawing.Imaging.ImageFormat.Png);
Chandan
2191 gold badge3 silver badges17 bronze badges
answered Jan 14, 2016 at 7:21
Anjan KantAnjan Kant
3,90039 silver badges38 bronze badges
GDI+ exceptions occured due to below points
- Folder access issue
- Missing properties of images
If folder issue — please provide access to application
If Missing properties then use below code
Code 1
using (Bitmap bmp = new Bitmap(webStream))
{
using (Bitmap newImage = new Bitmap(bmp))
{
newImage.Save("c:temptest.jpg", ImageFormat.Jpeg);
}
}
Code 2
using (Bitmap bmp = new Bitmap(webStream))
{
using (Bitmap newImage = new Bitmap(bmp))
{
newImage.SetResolution(bmp.HorizontalResolution, bmp.VerticalResolution);
Rectangle lockedRect = new Rectangle(0, 0, bmp.Width, bmp.Height);
BitmapData bmpData = newImage.LockBits(lockedRect, ImageLockMode.ReadWrite, bmp.PixelFormat);
bmpData.PixelFormat = bmp.PixelFormat;
newImage.UnlockBits(bmpData);
using (Graphics gr = Graphics.FromImage(newImage))
{
gr.SmoothingMode = SmoothingMode.HighQuality;
gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
gr.PixelOffsetMode = PixelOffsetMode.HighQuality;
}
foreach (var item in bmp.PropertyItems)
{
newImage.SetPropertyItem(item);
}
newImage.Save("c:temptest.jpg", ImageFormat.Jpeg);
}
}
Different between code 1 and code 2
Code — 1 : it will just create image and can open it on normal image viewer
- the image can’t open in Photoshop
- Image size will be double
Code — 2 : to open image in image edition tools use code
by using code 1 it just create images but it not assign image marks.
answered Nov 27, 2019 at 12:06
I always check/test these:
- Does the path + filename contain illegal characters for the given filesystem?
- Does the file already exist? (Bad)
- Does the path already exist? (Good)
- If the path is relative: am I expecting it in the right parent directory (mostly
bin/Debug
)?
- Is the path writable for the program and as which user does it run? (Services can be tricky here!)
- Does the full path really, really not contain illegal chars? (some unicode chars are close to invisible)
I never had any problems with Bitmap.Save()
apart from this list.
answered Mar 21, 2017 at 4:40
I had a different issue with the same exception.
In short:
Make sure that the Bitmap
‘s object Stream
is not being disposed before calling .Save
.
Full story:
There was a method that returned a Bitmap
object, built from a MemoryStream
in the following way:
private Bitmap getImage(byte[] imageBinaryData){
.
.
.
Bitmap image;
using (var stream = new MemoryStream(imageBinaryData))
{
image = new Bitmap(stream);
}
return image;
}
then someone used the returned image to save it as a file
image.Save(path);
The problem was that the original stream was already disposed when trying to save the image, throwing the GDI+ exeption.
A fix to this problem was to return the Bitmap
without disposing the stream itself but the returned Bitmap
object.
private Bitmap getImage(byte[] imageBinaryData){
.
.
.
Bitmap image;
var stream = new MemoryStream(imageBinaryData))
image = new Bitmap(stream);
return image;
}
then:
using (var image = getImage(binData))
{
image.Save(path);
}
answered Oct 8, 2018 at 9:28
YanYan
4132 silver badges16 bronze badges
1
I got it working using FileStream, get help from these
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);
answered Apr 7, 2013 at 14:53
donstackdonstack
2,5283 gold badges29 silver badges44 bronze badges
For me it was a permission problem. Somebody removed write permissions on the folder for the user account under which the application was running.
answered Nov 17, 2014 at 9:18
Krisztián BallaKrisztián Balla
18.7k13 gold badges66 silver badges82 bronze badges
Create folder path image/thumbs on your hard disk => Problem solved!
answered Jul 24, 2014 at 16:50
Chưa biếtChưa biết
8998 silver badges6 bronze badges
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);
answered Jun 16, 2016 at 13:52
I encountered this error while trying to convert Tiff images to Jpeg. For me the issue stemmed from the tiff dimensions being too large. Anything up to around 62000 pixels was fine, anything above this size produced the error.
answered Oct 20, 2016 at 8:59
Richtea88Richtea88
1011 silver badge4 bronze badges
for me it was a path issue when saving the image.
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;
So I fixed it by adding the following forward slash
String path = "images/savedimages....
should be
String path = "/images/savedimages....
Hope that helps anyone stuck!
answered Jan 10, 2018 at 16:46
imBlueimBlue
1141 silver badge11 bronze badges
from msdn: public void Save (string filename);
which is quite surprising to me because we dont just have to pass in the filename, we have to pass the filename along with the path for example: MyDirectory/MyImage.jpeg
, here MyImage.jpeg
does not actually exist yet, but our file will be saved with this name.
Another important point here is that if you are using Save()
in a web application then use Server.MapPath()
along with it which basically just returns the physical path for the virtual path which is passed in. Something like: image.Save(Server.MapPath("~/images/im111.jpeg"));
answered Mar 29, 2019 at 18:57
I use this solution
int G = 0;
private void toolStripMenuItem17_Click(object sender, EventArgs e)
{
Directory.CreateDirectory("picture");// هذه العملية للرسم بدون ان يحذف بقية الرسومات
G = G + 1;
FormScreen();
memoryImage1.Save("picture\picture" + G.ToString() + ".jpg");
pictureBox1.Image = Image.FromFile("picture\picture" + G.ToString() + ".jpg");
}
LarsTech
80.1k14 gold badges150 silver badges222 bronze badges
answered Jun 23, 2020 at 15:40
1
The code below solved my problem
pictureBox1.Image=myImage;
Bitmap bmp = new Bitmap(pictureBox1.Image);
bmp.Save("C:\Users/super/Desktop/robin.jpg");
desertnaut
56.1k21 gold badges134 silver badges163 bronze badges
answered Jun 14, 2021 at 21:31
- Remove From My Forums
-
Question
-
Hello All,
I was just going to play around by generating some bitmaps programatically.
I started off with this simple example, expecting everything to go smoothly, but have run into a strange error.
The following code is by no means good, just something simple and complete I would expect to work:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;namespace BitmapOutput
{
public partial class Form1 : Form
{
/// <summary>
/// The picture i am drawing
/// </summary>
System.Drawing.Bitmap myBitmap;/// <summary>
/// Graphics object for drawing
/// </summary>
System.Drawing.Graphics myGrafx;public Form1()
{
InitializeComponent();this.myBitmap = new Bitmap(800, 600);
this.myGrafx = System.Drawing.Graphics.FromImage(this.myBitmap);
this.DrawPicture();
this.ShowPicture();
this.SavePicture();
}public void DrawPicture()
{
this.myGrafx.DrawEllipse(
new Pen(System.Drawing.Color.AliceBlue), new Rectangle(0, 0, 100, 100));
}public void ShowPicture()
{
this.pictureBox1.Image = this.myBitmap;
}public void SavePicture()
{
this.myBitmap.Save(«Output\out.bmp» , System.Drawing.Imaging.ImageFormat.Bmp );
}
}
}This runs fine until the SavePicture(…) function is called.
I get the exception:
«A generic error occurred in GDI+.»at the this.myBitmap.Save(…); line.
Most likely there is some detail that I have overlooked, and I appreciate it if anyone could point out to me what I could do to fix it.
But, I’d like to think that this code would work, it makes sense, and requires little effort, that should be one of the goals of .net
Any help or ideas are greatly appreciated!
P.S. how do I use ‘code’ tags?
Answers
-
it happens with me — its a minor bug which should *hopefully* be fixed in SP1 of .NET 2.0.
sometimes this error occurs, sometimes it doesnt
sometimes putting a Thread.Sleep() (for about 30 ms) helps it just before the save
smokehawker 0 / 0 / 8 Регистрация: 17.10.2012 Сообщений: 289 |
||||||||
1 |
||||||||
13.10.2016, 19:38. Показов 8044. Ответов 1 Метки нет (Все метки)
В сишарпе не силен, что не так? Additional information: A generic error occurred in GDI+.
код:
__________________
0 |
OwenGlendower Администратор 15247 / 12286 / 4904 Регистрация: 17.03.2014 Сообщений: 24,883 Записей в блоге: 1 |
||||
13.10.2016, 20:19 |
2 |
|||
smokehawker, попробуй указать другой путь. Например, папку «мои документы».
1 |
это, кажется, немного печально известная ошибка во всем интернете. Настолько, что я не смог найти ответ на свою проблему, поскольку мой сценарий не подходит. Исключение возникает, когда я сохраняю изображение в потоке.
странно, это отлично работает с png, но дает вышеуказанную ошибку с jpg и gif, что довольно запутанно.
большинство подобных проблем связаны с сохранением изображений в файлы без разрешений. По иронии судьбы решение заключается в использовании поток памяти, как и я….
public static byte[] ConvertImageToByteArray(Image imageToConvert)
{
using (var ms = new MemoryStream())
{
ImageFormat format;
switch (imageToConvert.MimeType())
{
case "image/png":
format = ImageFormat.Png;
break;
case "image/gif":
format = ImageFormat.Gif;
break;
default:
format = ImageFormat.Jpeg;
break;
}
imageToConvert.Save(ms, format);
return ms.ToArray();
}
}
подробнее об исключении. Причина, по которой это вызывает так много проблем, заключается в отсутствии объяснения : (
System.Runtime.InteropServices.ExternalException was unhandled by user code
Message="A generic error occurred in GDI+."
Source="System.Drawing"
ErrorCode=-2147467259
StackTrace:
at System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters encoderParams)
at System.Drawing.Image.Save(Stream stream, ImageFormat format)
at Caldoo.Infrastructure.PhotoEditor.ConvertImageToByteArray(Image imageToConvert) in C:UsersIanSVNCaldooCaldoo.CoordinatorPhotoEditor.cs:line 139
at Caldoo.Web.Controllers.PictureController.Croppable() in C:UsersIanSVNCaldooCaldoo.WebControllersPictureController.cs:line 132
at lambda_method(ExecutionScope , ControllerBase , Object[] )
at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassa.<InvokeActionMethodWithFilters>b__7()
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
InnerException:
OK вещи, которые я пробовал до сих пор.
- клонирование изображения и работа над этим.
- получение кодировщика для этого MIME, передающего это с настройкой качества jpeg.
28 ответов
хорошо, кажется, я нашел причину просто по чистой случайности, и в этом нет ничего плохого с этим конкретным методом, это еще более резервное копирование стека вызовов.
ранее я изменял размер изображения и как часть этого метода я возвращаю измененный объект следующим образом. Я вставил два вызова вышеуказанного метода и прямое сохранение в файл.
// At this point the new bitmap has no MimeType
// Need to output to memory stream
using (var m = new MemoryStream())
{
dst.Save(m, format);
var img = Image.FromStream(m);
//TEST
img.Save("C:test.jpg");
var bytes = PhotoEditor.ConvertImageToByteArray(img);
return img;
}
похоже, что поток памяти, на котором был создан объект и быть открытым во время сохранения объекта. Я не знаю почему. Кто-нибудь может просветить меня и как я могу обойти это.
Я возвращаюсь только из потока, потому что после использования кода изменения размера похож на этой файл назначения имеет неизвестный тип mime (img.RawFormat.Guid) и Id, как тип Mime, чтобы быть правильным для всех объектов изображения, поскольку это затрудняет запись общего кода обработки в противном случае.
редактировать
Это не в моем первоначальном поиске, но здесь ответ от Jon скит
Если вы получаете эту ошибку , то я могу сказать, что ваше приложение не имеет разрешения на запись в некоторые директории.
например, если вы пытаетесь сохранить изображение из потока памяти в файловой системе , вы можете получить эту ошибку.
пожалуйста, если вы используете XP, не забудьте добавить разрешение на запись для учетной записи aspnet в этой папке.
Если вы используете windows server (2003,2008) или Vista, убедитесь, что добавить разрешение на запись для Учетная запись сетевой службы.
надеюсь, это поможет кому-то.
Я добавлю эту причину ошибки, а также в надежде, что это поможет будущему интернет-путешественнику.
GDI + ограничивает максимальную высоту изображения до 65500
мы делаем некоторые основные изменения размера изображения, но при изменении размера мы стараемся поддерживать соотношение сторон. У нас есть парень QA, который слишком хорош в этой работе; он решил проверить это с помощью фотографии шириной в один пиксель, которая была высотой 480 пикселей. Когда изображение было масштабировано, чтобы соответствовать нашим размерам, высота была к северу от 68,000 пикселей и наше приложение взорвалось с A generic error occurred in GDI+
.
вы можете проверить это сами с помощью теста:
int width = 480;
var height = UInt16.MaxValue - 36; //succeeds at 65499, 65500
try
{
while(true)
{
var image = new Bitmap(width, height);
using(MemoryStream ms = new MemoryStream())
{
//error will throw from here
image.Save(ms, ImageFormat.Jpeg);
}
height += 1;
}
}
catch(Exception ex)
{
//explodes at 65501 with "A generic error occurred in GDI+."
}
жаль, что нет дружественного .net ArgumentException
брошен в конструктор Bitmap
.
в этой статье подробно объясняется, что именно происходит:зависимости конструктора растровых и изображений
короче говоря, на всю жизнь Image
состоящий из поток поток не должен быть разрушен.
Итак, вместо
using (var strm = new ... ) {
myImage = Image.FromStream(strm);
}
попробуй такое
Stream imageStream;
...
imageStream = new ...;
myImage = Image.FromStream(strm);
и вблизи imageStream в форме закрыть или закрыть веб-страницу.
вы также получите это исключение, если вы попытаетесь сохранить недопустимый путь или если есть проблема с разрешениями.
Если вы не уверены на 100%, что путь к файлу доступен и разрешения верны, попробуйте записать a в текстовый файл. Это займет всего несколько секунд, чтобы исключить то, что было бы очень простым решением.
var img = System.Drawing.Image.FromStream(incomingStream);
// img.Save(path);
System.IO.File.WriteAllText(path, "Testing valid path & permissions.");
и не забудьте очистить свой файл.
25
автор: Kirk Broadhurst
Сохранить изображение в переменную растрового изображения
using (var ms = new MemoryStream())
{
Bitmap bmp = new Bitmap(imageToConvert);
bmp.Save(ms, format);
return ms.ToArray();
}
Я обнаружил, что если одна из родительских папок, где я сохранял файл, имела конечное пространство, то GDI+ выдаст общее исключение.
другими словами, если бы я попытался сохранить «C:Documents и настройкиmyusernameлокальные настройкиTempABC DEF M1 трендовые значения Imagespicture.png » затем он выбросил общее исключение.
имя моей папки создавалось из имени файла, у которого было конечное пространство, поэтому это было легко .Обрезать () это и переместить на.
Это расширение / квалификация ответа Фреда, который заявил:»GDI ограничивает высоту изображения до 65534″. Мы столкнулись с этой проблемой с одним из наших приложений .NET, и, увидев сообщение, наша команда аутсорсинга подняла руки в воздух и сказала, что не может решить проблему без серьезных изменений.
на основе моего тестирования можно создавать / манипулировать изображениями с высотой больше 65534, но проблема возникает при сохранении в поток или файл В ОПРЕДЕЛЕННЫХ ФОРМАТАХ. В следующем коде t.Вызов метода Save () выбрасывает нашему другу общее исключение, когда высота пикселя составляет 65501 для меня. Из любопытства я повторил тест на ширину, и тот же предел применялся к экономии.
for (int i = 65498; i <= 100000; i++)
{
using (Bitmap t = new Bitmap(800, i))
using (Graphics gBmp = Graphics.FromImage(t))
{
Color green = Color.FromArgb(0x40, 0, 0xff, 0);
using (Brush greenBrush = new SolidBrush(green))
{
// draw a green rectangle to the bitmap in memory
gBmp.FillRectangle(greenBrush, 0, 0, 799, i);
if (File.Exists("c:tempi.jpg"))
{
File.Delete("c:tempi.jpg");
}
t.Save("c:tempi.jpg", ImageFormat.Jpeg);
}
}
GC.Collect();
}
та же ошибка также возникает при записи в поток памяти.
чтобы обойти это, вы можете повторить приведенный выше код и заменить ImageFormat.Tiff или ImageFormat.Bmp для ImageFormat.Формате JPEG.
это работает до высоты / ширины 100,000 для меня — я не проверял пределы. Так уж получилось .Tiff был жизнеспособным вариантом для нас.
ПРЕДУПРЕДИЛ
потоки / файлы TIFF в памяти потребляют больше памяти, чем их аналоги JPG.
на всякий случай, если кто-то делает такие глупые вещи, как я.
1. убедитесь, что path существует.
2. убедитесь, что у вас есть разрешения на запись.
3. убедитесь, что ваш путь правильный, в моем случае мне не хватало имени файла в TargetPath : (
Он должен был сказать, что ваш путь отстой, чем » общая ошибка произошла в GDI+»
Я также получил эту ошибку при сохранении JPEG, но только для определенных изображений.
мой окончательный код:
try
{
img.SaveJpeg(tmpFile, quality); // This is always successful for say image1.jpg, but always throws the GDI+ exception for image2.jpg
}
catch (Exception ex)
{
// Try HU's method: Convert it to a Bitmap first
img = new Bitmap(img);
img.SaveJpeg(tmpFile, quality); // This is always successful
}
Я не создавал изображения, поэтому я не могу сказать, в чем разница.
Я был бы признателен, если бы кто-нибудь смог это объяснить.
Это моя функция SaveJpeg просто FYI:
private static void SaveJpeg(this Image img, string filename, int quality)
{
EncoderParameter qualityParam = new EncoderParameter(Encoder.Quality, (long)quality);
ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg");
EncoderParameters encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = qualityParam;
img.Save(filename, jpegCodec, encoderParams);
}
Если ваш код выглядит следующим образом, то также Эта ошибка возникает
private Image GetImage(byte[] byteArray)
{
using (var stream = new MemoryStream(byteArray))
{
return Image.FromStream(stream);
}
}
правильный
private Image GetImage(byte[] byteArray)
{
var stream = new MemoryStream(byteArray))
return Image.FromStream(stream);
}
это может быть потому, что мы возвращаемся из блока using
была очень похожая проблема, а также попытался клонировать изображение, которое не работает. Я обнаружил, что лучшим решением было создать новый растровый объект из изображения, загруженного из потока памяти. Таким образом, поток может быть удален, например
using (var m = new MemoryStream())
{
var img = new Bitmap(Image.FromStream(m));
return img;
}
надеюсь, что это помогает.
решено-у меня была эта точная проблема. Исправление для меня заключалось в увеличении дисковой квоты для IUSR на сервере IIS. В этом случае у нас есть приложение каталога с изображениями элементов и тому подобное. Квота загрузки для «анонимного веб-пользователя» была установлена на 100 МБ, что является значением по умолчанию для серверов IIS этой конкретной хостинговой компании. Я поднял его до 400MB и смог загрузить изображения без ошибок.
Это может быть не ваша проблема, но если это так, это легко исправить.
ошибка, возникающая из-за разрешения. убедитесь, что у папки есть все разрешения.
public Image Base64ToImage(string base64String)
{
// Convert Base64 String to byte[]
byte[] imageBytes = Convert.FromBase64String(base64String);
MemoryStream ms = new MemoryStream(imageBytes, 0,
imageBytes.Length);
// Convert byte[] to Image
ms.Write(imageBytes, 0, imageBytes.Length);
Image image = Image.FromStream(ms, true);
return image;
}
img.Save("YOUR PATH TO SAVE IMAGE")
в моем случае проблема была в пути, который я сохранял (корень C:
). Изменение его на D:1
сделал исключение.
другая причина этой ошибки-путь, указанный в методе сохранения экземпляра растрового изображения, не существует или вы не указали полный / допустимый путь.
просто была эта ошибка, потому что я передавал имя файла, а не полный путь!
Это произойдет!
моя очередь!
using (System.Drawing.Image img = Bitmap.FromFile(fileName))
{
... do some manipulation of img ...
img.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg);
}
получил его на .Спасать… потому что using () держит файл открытым, поэтому я не могу его перезаписать. Возможно, это поможет кому-то в будущем.
та же проблема, с которой я столкнулся. Но в моем случае я пытался сохранить файл на диске C, и он был недоступен. Поэтому я попытался сохранить его в D-диске, который был полностью доступен, и мне это удалось.
поэтому сначала проверьте свои папки, в которых вы пытаетесь сохранить. У вас должны быть все права (чтение и запись) для этой конкретной папки.
Я заметил, что ваш случай «jpeg» на самом деле:
default:
format = ImageFormat.Jpeg;
break;
вы уверены, что формат JPEG, а не что-то другое?
Я бы попробовал:
case "image/jpg": // or "image/jpeg" !
format = ImageFormat.Jpeg;
break;
или imageToConvert.MimeType()
на самом деле возвращаются.
обновление
есть ли другая инициализация, которую вам нужно сделать для объекта MemoryStream?
просто чтобы бросить еще одно возможное решение в кучу, я упомяну случай, с которым я столкнулся с этим сообщением об ошибке. Метод Bitmap.Save
будет через это исключение при сохранении растрового изображения, которое я преобразовал и отображал. Я обнаружил, что он не будет бросать исключение, если у оператора есть точка останова, и не будет, если Bitmap.Save
предшествовал Thread.Sleep(500)
поэтому я полагаю, что происходит какое-то соревнование ресурсов.
просто скопируйте изображение в новое растровое изображение объекта было достаточно, чтобы предотвратить появление этого исключения:
new Bitmap(oldbitmap).Save(filename);
Если вы пытаетесь сохранить изображение к удаленное расположение обязательно добавьте NETWORK_SERVICE
учетная запись пользователя в настройки безопасности и дать этому пользователю права на чтение и запись. Иначе это не сработает.
byte[] bts = (byte[])page1.EnhMetaFileBits;
using (var ms = new MemoryStream(bts))
{
var image = System.Drawing.Image.FromStream(ms);
System.Drawing.Image img = image.GetThumbnailImage(200, 260, null, IntPtr.Zero);
img.Save(NewPath, System.Drawing.Imaging.ImageFormat.Png);
}
- У меня была эта проблема на тестовом сервере, но не на живом сервере.
- я записывал изображение в поток, поэтому это не было проблемой разрешения.
- Я непосредственно развертывал некоторые из них .dll на тестовый сервер.
- развертывание всего решения исправило проблему, поэтому, вероятно, это было странное несоответствие компиляции
У нас была такая же проблема при создании PDF на производственном сервере.
перезапустить пул приложений исправить эту проблему.
надеюсь, это поможет кому-то.
для меня я использовал Image.Save(Stream, ImageCodecInfo, EncoderParameters)
и, по-видимому, это было причиной печально известного A generic error occurred in GDI+
ошибка.
Я пытался использовать EncoderParameter
сохранить jpegs в качестве 100%. Это отлично работало на » моей машине «(doh!) и не на производстве.
когда я использовал Image.Save(Stream, ImageFormat)
вместо этого ошибка исчезла! Поэтому, как идиот, я продолжал использовать последний, хотя он сохраняет их в качестве по умолчанию, которое я предполагаю, составляет всего 50%.
Надеюсь, эта информация поможет кто-то.
Я тоже столкнулся с проблемой. Проблема была связана с утилизацией потока загрузки. Но я не утилизировал его, он был внутри .Net framework. Все, что мне нужно было сделать, это использовать:
image_instance = Image.FromFile(file_name);
вместо
image_instance.Load(file_name);
image_instance имеет тип System.Окна.Формы.Управления PictureBox!
Picturebox’S Load () размещает поток, из которого было загружено изображение, и я этого не знал.
на основе ответа от @savindra, если вы RHM в вашем приложении и попробуйте запустить как администратор тогда это должно решить вашу проблему.
мой, казалось, был проблемой разрешения.
If you are trying to modify Bitmap, you may encounter the following GDI error which is very generic and does not provide any details. As the exception does not provide more details, it is very frustrating to figure out the root cause.
Bitmap.Save(): A generic error occurred in GDI+
2 Reasons Why This Generic GDI Error Occurred
GDI+ throws an error when it cannot save file. Following are 2 reasons why this error occurs.
- When you are initializing a Bitmap object from an image stored on hard disk, it creates a lock on the underlying image file. Due to the lock when you try to save and overwrite your modified bitmap, it throws this error.
- When you are saving a file, make sure the user has Write permission on the folder. This is important when you are getting this error on the Website because Website runs under restricted permissions.
There are three ways to fix this issue.
- Instead of overwriting the file, save a new file with a different name than the original file
- Only when the Bitmap object is disposed, the underlying lock on the file is removed. Once the lock is removed, you may overwrite the file. If you must overwrite the existing file, create a separate bitmap object from existing bitmap object. Now dispose the old bitmap object which will release the lock on the image file. Go ahead and make the needed changes in new bitmap object and save the new bitmap object with original image file name.
- Make sure the folder in which you are trying to save file is writable. In Web Application, the application pool or account which runs the Website must have write access to to the folder in order to save the file. For example if you are running Website under “DefaultAppPool”, you must give “IIS AppPoolDefaultAppPool” user “write” access to the folder.
Sample Code That Causes Error
Dim oBitmap As Bitmap
oBitmap = New Bitmap("c:\example.jpg")
Dim oGraphic As Graphics
oGraphic = Graphics.FromImage(oBitmap)
Dim oBrush As New SolidBrush(Color.Black)
Dim ofont As New Font("Arial", 8 )
oGraphic.DrawString("Some text to write", ofont, oBrush, 10, 10)
oBitmap.Save("c:\example.jpg",ImageFormat.Jpeg)
oBitmap.Dispose()
oGraphic.Dispose()
As shown in the above example, I am reading the bitmap, modifying it and overwriting it on the same file. As the process creates a lock on the underlying image, it will throw an exception.
Sample Code With Fix
Dim oBitmap As Bitmap
oBitmap = New Bitmap("c:\example.jpg")
Dim oGraphic As Graphics
' Here create a new bitmap object of the same height and width of the image.
Dim bmpNew As Bitmap = New Bitmap(oBitmap.Width, oBitmap.Height)
oGraphic = Graphics.FromImage(bmpNew)
oGraphic.DrawImage(oBitmap, New Rectangle(0, 0, _
bmpNew.Width, bmpNew.Height), 0, 0, oBitmap.Width, _
oBitmap.Height, GraphicsUnit.Pixel)
' Release the lock on the image file. Of course,
' image from the image file is existing in Graphics object
oBitmap.Dispose()
oBitmap = bmpNew
Dim oBrush As New SolidBrush(Color.Black)
Dim ofont As New Font("Arial", 8 )
oGraphic.DrawString("Some text to write", ofont, oBrush, 10, 10)
oGraphic.Dispose()
ofont.Dispose()
oBrush.Dispose()
oBitmap.Save("c:\example.jpg", ImageFormat.Jpeg)
oBitmap.Dispose()
As shown in the above example, as soon as I create bitmap from an image, I am disposing the original bitmap. It releases the lock on the file. Hence I am able to overwrite the same file with updated bitmap.
#c#
#c#
Вопрос:
У меня ошибка при экспорте изображения из PictureBox
» В GDI произошла общая ошибка »
********** Текст исключения **********
System.Runtime.InteropServices.ExternalException (0x80004005): A generic error occurred in GDI .
at System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams)
at System.Drawing.Image.Save(String filename, ImageFormat format)
at Soccer_Studio.Form1.button2_Click(Object sender, EventArgs e) in ***********************Form1.cs:line 137
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Messageamp; m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Messageamp; m)
at System.Windows.Forms.ButtonBase.WndProc(Messageamp; m)
at System.Windows.Forms.Button.WndProc(Messageamp; m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Messageamp; m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Messageamp; m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Это мой код
using (Bitmap tempImage = new Bitmap(pictureBox1.Image))
{
pictureBox1.Image.Save(@"C:UsersMenaDesktop", System.Drawing.Imaging.ImageFormat.Bmp);
}
В чем проблема в коде?
Комментарии:
1.
A generic error occurred in GDI
, это действительно не говорит слишком много. Что говорит отладчик?
Ответ №1:
Возможно, вам понадобится имя файла…
pictureBox1.Image.Save(@"C:UsersMenaDesktopfile.bmp",
System.Drawing.Imaging.ImageFormat.Bmp);
Комментарии:
1. Акцент
file.bmp
на пути.