A generic error occurred in gdi что это

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

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's user avatar

Cœur

36.4k25 gold badges191 silver badges258 bronze badges

asked Apr 7, 2013 at 13:18

donstack's user avatar

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

Community's user avatar

answered Apr 7, 2013 at 13:26

NSGaga-mostly-inactive's user avatar

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 Edit's user avatar

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 Passant's user avatar

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

  1. Verify that the destination folder exists
  2. Verify that there isn’t already a file with the same name in the destination folder

Marcos Dimitrio's user avatar

answered Aug 14, 2014 at 7:56

Palanikumar's user avatar

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»

Tolga Evcimen's user avatar

answered Dec 3, 2015 at 11:52

Asad's user avatar

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's user avatar

Chandan

2191 gold badge3 silver badges17 bronze badges

answered Jan 14, 2016 at 7:21

Anjan Kant's user avatar

Anjan KantAnjan Kant

3,90039 silver badges38 bronze badges

GDI+ exceptions occured due to below points

  1. Folder access issue
  2. 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

Prem Kumar Badri's user avatar

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

Xan-Kun Clark-Davis's user avatar

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

Yan's user avatar

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

donstack's user avatar

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 Balla's user avatar

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ết's user avatar

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

Balaji Dinakaran's user avatar

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

Richtea88's user avatar

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

imBlue's user avatar

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

Fakhar Ahmad Rasul's user avatar

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's user avatar

LarsTech

80.1k14 gold badges150 silver badges222 bronze badges

answered Jun 23, 2020 at 15:40

Raho's user avatar

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's user avatar

desertnaut

56.1k21 gold badges134 silver badges163 bronze badges

answered Jun 14, 2021 at 21:31

Robin's user avatar

  • 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

Метки нет (Все метки)


В сишарпе не силен, что не так?
ошибка:
An unhandled exception of type ‘System.Runtime.InteropServices.ExternalException’ occurred in System.Drawing.dll

Additional information: A generic error occurred in GDI+.
в этой строке:

C#
1
  tempImage.SaveAsFile(@"C:full.png", ImageFormat.Png);

код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;
using System.Threading.Tasks;
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support.UI;
using OpenQA.Selenium.Remote;
using OpenQA.Selenium.Interactions;
using DeathByCaptcha;
using System.IO; // для работы с файлами
using System.Threading; // для пауз
using System.Net; // для скачки капчи
using System.Diagnostics; // для отслеживания процессов
 
namespace driver
{
    class Program
    {
        public static Bitmap CropImage(Bitmap source, Rectangle section)
        {
            Bitmap bmp = new Bitmap(section.Width, section.Height);
            Graphics g = Graphics.FromImage(bmp);
            g.DrawImage(source, 0, 0, section, GraphicsUnit.Pixel);
            return bmp;
        }
        static void Main(string[] args)
        {
            IWebDriver driver = new ChromeDriver();
 
            //replace with the page you want to navigate to
            string your_page = "https://www.google.com";
            driver.Navigate().GoToUrl(your_page);
 
            ITakesScreenshot ssdriver = driver as ITakesScreenshot;
            Screenshot screenshot = ssdriver.GetScreenshot();
 
            Screenshot tempImage = screenshot;
 
            tempImage.SaveAsFile(@"C:full.png", ImageFormat.Png);
 
            //replace with the XPath of the image element
            IWebElement my_image = driver.FindElement(By.XPath("//*[@id="hplogo"]/canvas[1]"));
 
            Point point = my_image.Location;
            int width = my_image.Size.Width;
            int height = my_image.Size.Height;
 
            Rectangle section = new Rectangle(point, new Size(width, height));
            Bitmap source = new Bitmap(@"C:full.png");
            Bitmap final_image = CropImage(source, section);
 
            final_image.Save(@"C:image.jpg");
        }
    }
}

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



OwenGlendower

Администратор

Эксперт .NET

15247 / 12286 / 4904

Регистрация: 17.03.2014

Сообщений: 24,883

Записей в блоге: 1

13.10.2016, 20:19

2

smokehawker, попробуй указать другой путь. Например, папку «мои документы».

C#
1
tempImage.SaveAsFile(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "full.png"), ImageFormat.Png);



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 вещи, которые я пробовал до сих пор.

  1. клонирование изображения и работа над этим.
  2. получение кодировщика для этого 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 на пути.

Понравилась статья? Поделить с друзьями:
  • A general system error occurred unable to push signed certificate to host
  • A general system error occurred timed out waiting for vpxa to start
  • A general system error occurred ssl exception unexpected eof
  • A general system error occurred retrieve ipmi sel request to host failed
  • A general system error occurred connection refused