Общая ошибка 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-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

37.3k25 gold badges196 silver badges267 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,7191 gold badge36 silver badges46 bronze badges

2

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

923k146 gold badges1695 silver badges2536 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,9604 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

3594 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

2151 gold badge3 silver badges17 bronze badges

answered Jan 14, 2016 at 7:21

Anjan Kant's user avatar

Anjan KantAnjan Kant

4,09041 silver badges39 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:\temp\test.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:\temp\test.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

4332 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,5573 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

19.3k13 gold badges68 silver badges84 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

9398 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

1111 silver badge5 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.7k14 gold badges153 silver badges225 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

57.7k27 gold badges140 silver badges167 bronze badges

answered Jun 14, 2021 at 21:31

Robin's user avatar

Такая ошибка может возникнуть в том случае, если пытаться сохранять в уже открытый файл. То есть ресурс «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.

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

Посмотрел предыдущие обсуждения темы «В GDI+ возникла ошибка общего вида». Не нашёл решения своего вопроса. Заранее благодарю за уделённое внимание.

Работаю в WINDOWS 7, Microsoft Visual Studio 2008.
Столкнулся с тем, что сохранение изображения в
Stream
работает не для всех картинок. Вот фрагмент кода:

public
Image
Изображение;

public
void
Записать(
Stream
поток ) {

  
Изображение.
Save( поток,
System.Drawing.Imaging.ImageFormat.Png
);

  
}

При выполнении сохранения некоторых картинок и возникает ошибка. Появление ошибки не зависит от размера картинки и от выбранного формата. Сами картинки я открывал и сохранял в другом формате в
Paint. Не помогает. Зато, помогает клавиша
PrtScr
. Тем же Paint
вырезаю картинку и сохраняю, и всё работает. Но, с большой картинкой (больше экрана) этот номер не проходит.

Помогите, кто знает как обойти эту неприятность. Спасибо!

Rillaxac

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

1

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

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


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

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

делаю так:

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



0



kolorotur

Эксперт .NET

17346 / 12757 / 3338

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

Сообщений: 21,036

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

17346 / 12757 / 3338

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

Сообщений: 21,036

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

17346 / 12757 / 3338

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

Сообщений: 21,036

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

17346 / 12757 / 3338

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

Сообщений: 21,036

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

16313 / 12804 / 5058

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

Сообщений: 26,074

Записей в блоге: 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:\Users\Karashka\Desktop\C#\MVD-2bad\MVD-2\main_gate.cs:строка 235
InnerException:

Миниатюры

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



0



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

Эксперт .NET

16313 / 12804 / 5058

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

Сообщений: 26,074

Записей в блоге: 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

16313 / 12804 / 5058

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

Сообщений: 26,074

Записей в блоге: 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

16313 / 12804 / 5058

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

Сообщений: 26,074

Записей в блоге: 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



9 ответов

Что, поскольку файл изображения используется вашим picturebox1.Image, попробуйте сохранить его в другом пути к файлу:

picturebox1.Image = Image.FromFile(FileName);
Bitmap bm = new Bitmap(pictureBox1.Image); 
bm.Save(@"New File Name", ImageFormat.Bmp);

Изменить: Вы также можете добавить копию с изображения в первую очередь, например:

picturebox1.Image = new Bitmap(Image.FromFile(FileName));
Bitmap bm = new Bitmap(pictureBox1.Image); 
bm.Save(FileName, ImageFormat.Bmp);//no error will occurs here.

Jalal Said

Поделиться

Метод FromFile блокирует файл, поэтому для чтения изображения используйте метод Image.FromStream():

byte[] bytes = System.IO.File.ReadAllBytes(filename);
System.IO.MemoryStream ms = new System.IO.MemoryStream(bytes);
pictureBox1.Image = Image.FromStream(ms);

Затем сохраните, как раньше.

adatapost

Поделиться

Это также может произойти, если путь не существует.

Вы можете создать директорию с помощью:

System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(FileName));

weston

Поделиться

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

Общая ошибка произошла в GDI +, JPEG-изображении в 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: Просто запись из памяти. Сохранение «посреднику» MemoryStream должно работать:

Например, замените это:

Bitmap newBitmap = new Bitmap(thumbBMP);
thumbBMP.Dispose();
thumbBMP = null;
newBitmap.Save("~/image/thumbs/" + "t" + objPropBannerImage.ImageId, ImageFormat.Jpeg);

с чем-то вроде:

string outputFileName = "...";
using (MemoryStream memory = new MemoryStream())
{
    using (FileStream fs = new FileStream(outputFileName, FileMode.Create, FileAccess.ReadWrite))
    {
        thumbBMP.Save(memory, ImageFormat.Jpeg);
        byte[] bytes = memory.ToArray();
        fs.Write(bytes, 0, bytes.Length);
    }
}

Mou

Поделиться

попробуйте это.

picturebox1.Image = Image.FromFile(FileName);
Bitmap bm = new Bitmat(pictureBox1.Image); 
Image img = (Image)b;
img.Save(FileName, ImageFormat.Bmp);

TheMuyu

Поделиться

Попробуйте следующее:

private void LoadPictureBoxWithImage( string ImagePath)
{
    Stream objInputImageStream = null;
    BitmapData bmdImageData = null;
    Bitmap bmpSrcImage = null, bmTemp = null;
    byte[] arrImageBytes = null;
    int bppModifier = 3;
    try
    {

        objInputImageStream = new MemoryStream();
        using (FileStream objFile = new FileStream(ImagePath, FileMode.Open, FileAccess.Read))
        {
            objFile.CopyTo(objInputImageStream);
        }

        bmpSrcImage = new Bitmap(objInputImageStream);
        bppModifier = bmpSrcImage.PixelFormat == PixelFormat.Format24bppRgb ? 3 : 4;

        //reda from byte[] to bitmap               
        bmdImageData = bmpSrcImage.LockBits(new Rectangle(0, 0, bmpSrcImage.Width, bmpSrcImage.Height), ImageLockMode.ReadOnly, bmpSrcImage.PixelFormat);
        arrImageBytes = new byte[Math.Abs(bmdImageData.Stride) * bmpSrcImage.Height];

        System.Runtime.InteropServices.Marshal.Copy(bmdImageData.Scan0, arrImageBytes, 0, arrImageBytes.Length);
        bmpSrcImage.UnlockBits(bmdImageData);

        pbSetup.Image = (Bitmap)bmpSrcImage.Clone();
        pbSetup.Refresh();

    }
    catch (Exception ex)
    {
        throw new Exception("Error in Function " + System.Reflection.MethodInfo.GetCurrentMethod().Name + "; " + ex.Message);
    }
    finally
    {
        if (objInputImageStream != null)
        {
            objInputImageStream.Dispose();
            objInputImageStream = null;
        }
        if (bmdImageData != null)
        {
            bmdImageData = null;
        }
        if (bmpSrcImage != null)
        {
            bmpSrcImage.Dispose();
            bmpSrcImage = null;
        }
        if (bmTemp != null)
        {
            bmTemp.Dispose();
            bmTemp = null;
        }
        if (arrImageBytes != null)
        {
            arrImageBytes = null;
        }
    }

}

Kalpana

Поделиться

Это также может произойти, если вы забыли добавить имя файла:

bm.Save(@"C:\Temp\Download", System.Drawing.Imaging.ImageFormat.Png);

И может быть исправлено добавлением имени файла:

bm.Save(@"C:\Temp\Download\Image.png", System.Drawing.Imaging.ImageFormat.Png);

Примечание. Фактически вам не нужно добавлять расширение для его работы.

AzzamAziz

Поделиться

попробуйте это, он будет работать

public void SavePicture()
{
     Bitmap bm = new Bitmap(this.myBitmap)
     bm.Save("Output\\out.bmp" ,System.Drawing.Imaging.ImageFormat.Bmp );
}

Saurabh Solanki

Поделиться

Так же, как @Jalal Aldeen Saa’d сказал, что окно с картинками использует файл и заблокировано из замены файла.

//unlock file by clearing it from picture box
if (picturebox1.Image != null)
{
   picturebox1.Image.Dispose();
   picturebox1.Image = null;
}

//put back the picture inside the pictureBox?

V-SHY

Поделиться

Ещё вопросы

  • 0UI-роутер: обновить родителя от ребенка
  • 1Как заставить функцию выставлять свои объекты и методы-члены, используя RequireJS AMD
  • 1Как добавить аннотации Java в JNI SWIG API?
  • 1Firebase & Google map — читайте данные и создавайте маркеры. Как читать объект?
  • 0рекурсивные результаты итератора каталога: отфильтровывать определенные символы из результирующих путей
  • 1Хранимая процедура не выполняется ASP.NET C #
  • 0Размещение текста над набором изображений с использованием jQuery
  • 1Ошибка проверки XML-схемы «Содержимое элемента flowPara не завершено»
  • 1Установка style.backgroundColor выключает код
  • 1Как сделать динамическое определение объема для отслеживания транзакций в NodeJ?
  • 1Кадр данных Pandas в дублированную матрицу в сумме величин
  • 0изменить размер изображения и сохранить его с новым размером
  • 0не добавлять дубликаты в корзину
  • 1Функция apply (), вызываемая на Function.prototype.bind в JavaScript?
  • 0Как перемещаться по пунктам / деталям в списке JqeuryMobile
  • 1Булевский DataFrame из серии с самим собой в Pandas
  • 1Как я могу узнать, совершают ли пользователи повторные посещения?
  • 1Проблемы с созданием объекта и помещением его в ArrayList
  • 1Умножение матриц с использованием EJML
  • 1как заставить ckeditor перестать удалять пустые div
  • 1AssertAlmostEqual для значения в dict
  • 1Почему Java Thread искажает печать на консоль [дубликаты]
  • 0Firefox мой тд текст не выравнивается в середине ячейки
  • 0отправить ответ из node.js в Jquery
  • 0JQGrid: как создать столбец с 5 вариантами выбора (5 переключателей)
  • 0Сокращающиеся интервалы окна
  • 0Создайте эффект «push down» в фиде активности с помощью jQuery
  • 1Смотрите сигнатуру функции где указатель указывает на
  • 1Список радиокнопок
  • 0Ошибка msvcr110d.dll! memcpy при тестировании структур и массивов
  • 1ChartJS — установить другой текст при наведении, чем описание по оси X
  • 0Обработчик событий Jquery не работает при вызове со страницы
  • 0текстовый текст getSuggestions в диалоге jQuery
  • 1Пользовательская сериализация gemfire не помогает
  • 0NodeJS асинхронный вызов MySQL к пулу соединений не возвращает результата
  • 0как переписать URL в Yii?
  • 1Как изменить панель инструментов при переходе от действия к фрагменту
  • 0Двоичное дерево JavaScript с поиском по ширине
  • 0C ++ Array передается по ссылке, но как это понять?
  • 0радио выбрано / не выбрано на основе выпадающего списка
  • 0PHP параметризован на запрос MySQL с LIKE и CONCAT на частичной строке
  • 0выходная сумма рекурсивной трассировки серии
  • 0Навигация по массиву с границами столбцов
  • 0$ rootScope не синхронизирован с $ scope
  • 0c ++ — повторное использование std :: fstream
  • 1Невозможно добавить изображение к кнопке с помощью getResource () (получить NullPointerException — создание проекта с помощью муравья)
  • 1Кнопка входа в систему не может достичь [httpost]
  • 0Почему я не могу использовать службу $ http в разрешении маршрута?
  • 0FMOD API не возвращает версию FMOD должным образом
  • 1Адаптер Android Studio и Firebase

Понравилась статья? Поделить с друзьями:
  • Общая ошибка epson stylus 1410
  • Общая ошибка epson l100
  • Общая ошибка 988 терминал сбербанк
  • Общая ошибка 971 операция отклонена
  • Общая ошибка 8001 пионер