C# blokuje plik

0

Po wczytaniu obrazka do Pictureboxa:

 m_Bitmap = (Bitmap)Bitmap.FromFile(iconFiles[zaznaczona]);
pictureBox1.Image = m_Bitmap;

Próbuje go zapisac:
pictureBox1.Image.Save(iconFiles[obrazek_w_pb]);

I dostaje wyjątek:
A generic error occurred in GDI+.

Nie moge nadpisać obrazka ponieważ mój program go używa. Jak można odblokować obrazek ?

1
using System;
using System.Drawing;
using System.Windows.Forms;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Bitmap m_Bitmap = (Bitmap)Bitmap.FromFile(@"C:\Users\Jarek\Pictures\Ball.bmp");
            PictureBox box = new PictureBox();
            box.Image = m_Bitmap;

            box.Image.Save(@"C:\Users\Jarek\Pictures\Ball2.bmp");
        }
    }
}

U mnie działa.

Nie masz gdzieś jakiś np. Streamów czytających z tego pliku? "A generic error occurred in GDI+." - to jest cała treść wyjątku?

0
 Bitmap m_Bitmap = new Bitmap(Bitmap.FromFile(iconFiles[zaznaczona]));
            pictureBox1.Image = m_Bitmap;
            pictureBox1.Image.Save(iconFiles[zaznaczona]);

W linijce z Save dostaje External Exception {"A generic error occurred in GDI+."}

1

Google nie gryzie :] Chociaż co prawda wszystkie wyniki były po angielsku.

http://channel9.msdn.com/forums/TechOff/148357-A-generic-error-occurred-in-GDI/
Sprawdziłem (żeby oszczędzić ci czytania) - jeśli plik który zapisujesz jest tym samym plikiem który odczytałeś (iconFiles[zaznaczona] == iconFiles[zaznaczona]!) to wystąpi ExternalException.

Gdybyś sam poszukał byłoby szybciej ;). Chyba że się mylę i nie o to chodzi?

0

Chodziło właśnie o to jak ominąć ten problem...

Opcja Wczytaj->Edytuj->Usuń oryginał->Zapisz jest trochę słaba

Ostatecznie problem rozwiązałem tak:

  1. Wczytaj bitmape
  2. Edytuj bitmape
  3. Zapisz bitmape do memorystream
  4. Dispose bitmap
  5. utworz nową bitmape(memorystream)
  6. zapisz nową bitmape
1

Opcja Wczytaj->Edytuj->Usuń oryginał->Zapisz jest trochę słaba

czemu? I czemu twoja jest lepsza [???] Twój sposób robi to samo, tylko dodatkowo niepotrzebnie angażując MemoryStream... Ale zresztą jak chcesz :)

EDIT: możesz jeszcze zmienić nazwę oryginałowi, też zadziała ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1