Externalexception в gdi возникла ошибка общего вида

Такая ошибка может возникнуть в том случае, если пытаться сохранять в уже открытый файл. То есть ресурс «Test2.jpg» ранее был открыт и не освобождён.

Так что ищите в своём коде, где у вас ещё используется «Test2.jpg» (и не освобождается при этом).


У вас не используются Dispose/using. Покажу, как должен выглядеть правильный код. Заодно поправил нейминг.

static void Edit(string text)
{
    using (var image = Image.FromFile("Test.jpg"))
    using (var graphics = Graphics.FromImage(image))
    using (var font = new Font("Xenia Font", 15, FontStyle.Bold))
    using (var brush = new SolidBrush(Color.WhiteSmoke))
    using (var stringFormat = new StringFormat())
    {
        graphics.DrawString(
            text,
            font,
            brush,
            new RectangleF(0, 0, 0, 340),
            stringFormat
        );

        image.Save("Test2.jpg", ImageFormat.Jpeg);
    }
}

Вообще, stringFormat вполне можно убрать, т. к. ему не задаются параметры, отличные от дефолтных.

RectangleF не является disposable, поэтому его не нужно заключать в using.

Также неясно, зачем метод сделан статическим.

Rillaxac

Заблокирован

1

23.03.2015, 11:55. Показов 36520. Ответов 19

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


Студворк — интернет-сервис помощи студентам

помогите пожалуйста при сохранении битмапа возникает такая ошибка: «В GDI+ возникла ошибка общего вида.»

делаю так:

C#
1
2
3
var bmp = new Bitmap(args[2]);
...
bmp.Save(args[2], System.Drawing.Imaging.ImageFormat.Bmp);



0



kolorotur

Эксперт .NET

17223 / 12675 / 3323

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

Сообщений: 20,949

23.03.2015, 12:10

2

Цитата
Сообщение от Rillaxac
Посмотреть сообщение

C#
1
var bmp = new Bitmap(args[2]);

Что находится в args[2]?
Оно понятно, что путь. Какой именно? Проверьте, чтобы он был корректен.

Цитата
Сообщение от Rillaxac
Посмотреть сообщение

Удалите эту часть — ошибка остается?



0



Rillaxac

Заблокирован

23.03.2015, 12:14

 [ТС]

3

Цитата
Сообщение от kolorotur
Посмотреть сообщение

Что находится в args[2]?
Оно понятно, что путь. Какой именно? Проверьте, чтобы он был корректен.

корректно, просто строка типа «picture.bmp»

Цитата
Сообщение от kolorotur
Посмотреть сообщение

Удалите эту часть — ошибка остается?

да



0



Эксперт .NET

17223 / 12675 / 3323

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

Сообщений: 20,949

23.03.2015, 12:18

4

Лучший ответ Сообщение было отмечено Rillaxac как решение

Решение

Цитата
Сообщение от Rillaxac
Посмотреть сообщение

да

Попробуйте тогда сохранить изображение под другим именем, например «picture_copy.bmp».



1



Rillaxac

Заблокирован

23.03.2015, 12:26

 [ТС]

5

Цитата
Сообщение от kolorotur
Посмотреть сообщение

Попробуйте тогда сохранить изображение под другим именем, например «picture_copy.bmp».

все уже и сам дошел, оказывается не нравится ему что я под тем же именем сохраняю…

Добавлено через 4 минуты
а не подскажите мне тогда как же все таки сделать чтобы сохранялось под тем же именем? это важно ! просто если я так сохраняю ошибка, пытался удалить файл перед сохранением пишет файл уже используется (соответственно моим же приложением, он же в битмап загружен), но мне надо именно под тем же именем принципиально !

Добавлено через 1 минуту
может быть можно получить как то этот битмап в буфер, закрыть объект и сохранить буфер в файл? только как получить объект в буфер?



0



kolorotur

Эксперт .NET

17223 / 12675 / 3323

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

Сообщений: 20,949

23.03.2015, 12:35

6

Цитата
Сообщение от Rillaxac
Посмотреть сообщение

может быть можно получить как то этот битмап в буфер, закрыть объект и сохранить буфер в файл?

Конечно:

C#
1
2
3
4
5
6
7
8
9
Bitmap bmp;
using (var fs = File.OpenRead(args[2]))
   bmp = new Bitmap(fs);
 
using (bmp)
{
   ...
   bmp.Save(args[2], System.Drawing.Imaging.ImageFormat.Bmp);
}



0



Rillaxac

Заблокирован

23.03.2015, 12:37

 [ТС]

7

Цитата
Сообщение от kolorotur
Посмотреть сообщение

Конечно:

ну можно и так а то я уже по другому решил))0

C#
1
2
3
4
5
var bmp = new Bitmap(args[2]);
var stream = new MemoryStream();
bmp.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
bmp.Dispose();
File.WriteAllBytes(args[2], stream.GetBuffer());



0



Эксперт .NET

17223 / 12675 / 3323

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

Сообщений: 20,949

23.03.2015, 13:04

8

Цитата
Сообщение от Rillaxac
Посмотреть сообщение

а то я уже по другому решил

Так памяти в два раза больше на каждое изображение используется



0



UAA1979

0 / 0 / 1

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

Сообщений: 45

01.02.2017, 21:17

9

Предыстория тут

Теперь вот что у меня получается. Если изображение из базы, JPG Формата, то Выдает ошибку(смотрите вложение) а если .png то все работает. Вот код :

C#
1
2
3
4
5
6
7
8
9
10
11
 byte[] img = null;
                 
 
                    if (vessel_pic.Image != null)
                    {
                        MemoryStream ms = new MemoryStream();
                        vessel_pic.Image.Save(ms, vessel_pic.Image.RawFormat);
                        img = ms.ToArray();
 
                         
                    }

Миниатюры

При сохранении битмапа возникает такая ошибка: "В GDI+ возникла ошибка общего вида"
 



0



0 / 0 / 1

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

Сообщений: 45

04.02.2017, 05:19

10

Никто не ответит?



0



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

Эксперт .NET

15635 / 12601 / 4993

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

Сообщений: 25,611

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

04.02.2017, 07:48

11

UAA1979, посмотри есть ли вложенное исключение (InnerException) и если да, то что написано в нем. Для этого нажми на ссылку «View detail…» в окне исключения и VS покажет тебе полную информацию о исключении.



1



0 / 0 / 1

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

Сообщений: 45

09.02.2017, 01:37

12

Извините что так поздно отвечаю просто не заметил( Насчет ошибки я нажимаю показать детали но ничего нового не показывает:
System.Runtime.InteropServices.ExternalException occurred
HResult=-2147467259
Message=В GDI+ возникла ошибка общего вида.
Source=System.Drawing
ErrorCode=-2147467259
StackTrace:
в System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters encoderParams)
в MWD_1.main_gate.v_add_btn_Click(Object sender, EventArgs e) в c:UsersKarashkaDesktopC#MVD-2badMVD-2main_gate.cs:строка 235
InnerException:

Миниатюры

При сохранении битмапа возникает такая ошибка: "В GDI+ возникла ошибка общего вида"
 



0



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

Эксперт .NET

15635 / 12601 / 4993

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

Сообщений: 25,611

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

09.02.2017, 16:14

13

UAA1979, раскрой исключение в окне View Detail и посмотри точно ли в InnerException ничего нет?



0



0 / 0 / 1

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

Сообщений: 45

09.02.2017, 19:04

14

И опять вы правы. Показывает нуль. Расскажу как бывает. Я выбираю из списка айтем. Он выбрасывает данные и изображение из базы на pictureBox. Я меняю данные но не изображение и хочу добавить как новый айтем. Вот тогда то и выходит эта ошибка. На pictureBox е по умолчанию стоит изображение и если нету изображения он добовляет эту. Но если из базы загрузить изображение то выходит эта ошибка.

Миниатюры

При сохранении битмапа возникает такая ошибка: "В GDI+ возникла ошибка общего вида"
 



0



0 / 0 / 1

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

Сообщений: 45

09.02.2017, 19:07

15

Да кстати если в базе pnq то нет проблем



0



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

Эксперт .NET

15635 / 12601 / 4993

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

Сообщений: 25,611

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

09.02.2017, 19:23

16

UAA1979, я как раз таки надеялся что в InnerException что-то будет. Посмотри чему равен в этот момент vessel_pic.Image и vessel_pic.Image.RawFormat для png и jpeg. Может с ними что-то не так.



0



UAA1979

0 / 0 / 1

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

Сообщений: 45

09.02.2017, 20:31

17

А как посмотреть не подскажите? Как то можно вывести изображение в

C#
1
MessageBox. Show

?



0



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

Эксперт .NET

15635 / 12601 / 4993

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

Сообщений: 25,611

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

09.02.2017, 20:44

18

UAA1979, запусти код под отладчиком



0



0 / 0 / 1

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

Сообщений: 45

14.02.2017, 22:45

19

Разобрался с отладчиком. Ничего не показывает просто на этом месте сценарий останавливается. Никакой ошибки ничего кроме то что выдает . 0 ошибок 0 предупреждений Где смотреть что передает в этот момент ума не приложу(

Миниатюры

При сохранении битмапа возникает такая ошибка: "В GDI+ возникла ошибка общего вида"
 



0



906 / 663 / 318

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

Сообщений: 1,543

15.02.2017, 13:48

20

UAA1979, кто ж в режиме Release дебажит!



0



Необработанное исключение типа «System.Runtime.InteropServices.ExternalException» произошло в System.Drawing.dll

Дополнительные сведения: В GDI+ возникла ошибка общего вида.

В кратце код такой:

using namespace System; using namespace System::Drawing;

void Form1::SaveNode(Image^ Img) {

MyClass^ newNode = gcnew MyClass();

IO::MemoryStream ^ConvImg = gcnew IO::MemoryStream(); Img->Save(ConvImg, Imaging::ImageFormat::Jpeg); newNode->Poster = ConvImg->ToArray(); // ЗДЕСЬ ВЫСКАКИВАЕТ ИСКЛ. }

newNode->Poster   имеет тип  «array <Byte>^»  или  «array <unsigned char>^»  —  я и так и так пробовал.

Img поступает в функцию прямо с PictureBox. Изображение формата JPEG.

Какие могут быть причины?

  • Remove From My Forums
  • Общие обсуждения

  • Добрый день !

    Развернут терминальный сервер на основе Server 2012 Standard. (установлены все обновления) Опубликованы приложения и используются.

    На днях сам по себе перестал функционировать web доступ. А именно https://х.х.х.х/RDWeb/ — отображается страница аутентификации, после ввода логина и пароля выводится сообщение на странице со следующей ошибкой: (Проводились попытки отремонтировать
    но пока безуспешны они были) Заранее благодарен за помощь.

    (Также при создании коллекции выводится информация что произошел сбой, при этом коллекция создается и работает в дальнейшем.)

    ———————————————————————————————————————————————————

    Ошибка сервера в приложении ‘/RDWeb/Pages’.
    В GDI+ возникла ошибка общего вида.
    Описание: Необработанное исключение при выполнении текущего веб-запроса. Изучите трассировку стека для получения дополнительных сведений о данной ошибке и о вызвавшем ее фрагменте кода.

    Сведения об исключении: System.Runtime.InteropServices.ExternalException: В GDI+ возникла ошибка общего вида.

    Ошибка источника:

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

    1. Добавьте директиву «Debug=true» в начало файла, сгенерировавшего ошибку.  Пример:

      <%@ Page Language=»C#» Debug=»true» %>

    или:

    2) Добавьте следующий раздел в файл конфигурации приложения:

    <configuration>
       <system.web>
           <compilation debug=»true»/>
       </system.web>
    </configuration>

    Следует учесть, что во втором случае в режиме отладки будут скомпилированы все файлы приложения. Первый метод позволяет скомпилировать в режиме отладки только определенный файл.

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

    Трассировка стека:

    [ExternalException (0x80004005): В GDI+ возникла ошибка общего вида.]
       System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters encoderParams) +813449
       Microsoft.TerminalServices.Publishing.Portal.IconInfo.MakeIconImage(Byte[] icon_contents, Int32 height, Int32 width, ImageFormat format) +194
       Microsoft.TerminalServices.Publishing.Portal.IconInfo.MakeImage(ImageFormat imageFormat, Int32 imageDimension) +56
       Microsoft.TerminalServices.Publishing.Portal.IconInfo.MakeImages(ImageFormat imageFormat, Int32[] imageDimensions) +64
       Microsoft.TerminalServices.Publishing.Portal.CPubAppIconFactory..cctor() +202

    [TypeInitializationException: Инициализатор типа «Microsoft.TerminalServices.Publishing.Portal.CPubAppIconFactory» выдал исключение.]
       Microsoft.TerminalServices.Publishing.Portal.CPubAppIconFactory..ctor(Int64 cacheExpirationTimeInMinutes) +27
       Microsoft.TerminalServices.Publishing.Portal.RWSCPUBAccessor..ctor(String tsName, Boolean PollAppFreshness) +986
       Microsoft.TerminalServices.Publishing.Portal.RWSCPubAndTsAccessor.GetWorkspaceInfo() +82
       Microsoft.TerminalServices.Publishing.Portal.RapWebService.GetWorkspaceInfo() +53
       Microsoft.TerminalServices.Publishing.Portal.WebFeed.GetDataForFeed(String userSid, String folderName, Dictionary`2& resource_list, Dictionary`2& ts_list, List`1& folders) +369
       Microsoft.TerminalServices.Publishing.Portal.WebFeed.GenerateFeed(String userSid, FeedXmlVersion xmlVersion, String folderPath, Boolean writeXmlDecl) +354
       ASP.ru_ru_default_aspx.Page_PreInit(Object sender, EventArgs e) +1805
       System.Web.UI.Page.PerformPreInit() +49
       System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1844

    Информация о версии: Платформа Microsoft .NET Framework, версия:4.0.30319; ASP.NET, версия:4.0.30319.18045

    • Изменен тип

      10 июля 2013 г. 6:42
      Нет действий

I’ve got a global Graphics object created from a Panel. At regular intervals an image is picked up from the disk and drawn into the panel using Graphics.DrawImage(). It works fine for a few iterations and then I’m getting the following helpful exception:

System.Runtime.InteropServices.ExternalException: A generic error occurred in GDI+.
at System.Drawing.Graphics.CheckErrorStatus(Int32 status)
at System.Drawing.Graphics.DrawImage(Image image, Int32 x, Int32 y)
at System.Drawing.Graphics.DrawImage(Image image, Point point)

I ruled out memory leaks as I dispose of the image object when I’m done with it. I know that the images are not corrupted and can be read fine as the program executes fine for a while before the panel stops showing.

I ran into the same problem when using a PictureBox but this time at least I got an error instead of nothing.

I checked the GDI objects and USER objects in the Task Manager but they’re always around 65 user objects and 165 GDI objects when the app works and when it doesn’t.

I do need to get to the bottom of this as soon as and it’s not like I can stick breakpoints in .NET System libraries and see where exactly execution fails.

Thanks in advance.

EDIT: This is the display code:

private void DrawImage(Image image)
{
  Point leftCorner = new Point((this.Bounds.Width / 2) - (image.Width / 2), (this.Bounds.Height / 2) - (image.Height / 2));
  _graphics.DrawImage(image, leftCorner);
}

the image load code:

private void LoadImage(string filename, ref Image image)
{
  MemoryStream memoryStream = DecryptImageBinary(Settings.Default.ImagePath + filename, _cryptPassword);

  image = Image.FromStream(memoryStream);

  memoryStream.Close();
  memoryStream.Dispose();
  memoryStream = null;
}

_image is global and its reference is updated in LoadImage. They are passed as parameters as I want to change the global references from as few places as possible only and keep the other methods self contained. _graphics is also global.

I’ve also got a webBrowser control for web sites and I either show an image or a website at one time. when there’s time to display an image, the following code executes:

webBrowser.Visible = false;
panel.Visible = true;
DrawImage(_image)
_image.Dispose();
_image = null;

_image is referencing a pre-loaded image.

Hope this helps.

Понравилась статья? Поделить с друзьями:
  • Express exe ошибка при выключении
  • Export video enc fail ошибка
  • Explorer при извлечении пакета установки произошла ошибка
  • Explorer ошибка при загрузке windows
  • Explorer выполнено но с ошибками