Autor Wątek: Błąd podczas zapisywania jpega  (Przeczytany 4780 razy)

Offline Coristo

  • Użytkownik

# Wrzesień 07, 2008, 20:08:53
Witam,
ostatnio pisząc aplikację w C# natrafiłem na dość dziwny (dla mnie :] ) problem. Otóż mam kontrolkę PictureBox do której ładuję plik typu jpg poprzez metodę PictureBox.Load(path). Dalej próbuję zapisać obrazek za pomocą PictureBox.Image.Save(path2, format). Gdy zapisuję plik jako typ bmp (format = ImageFormat.Bmp) to wszystko działa pięknie. Lecz gdy próbuję zapisać jako jpeg lub png to funkcja rzuca mi wyjątek "System.Runtime.InteropServices.ExternalException'". Z tego co wyczytałem z msdn to pojawia się on gdy próbujemy zapisać do tego samego pliku (u mnie zapisuję do innego). Dziwi mnie, czemu błąd nie pojawia się podczas zapisu do bmp, a wystepuje przy jpg (przecież plik bazowy też był tego typu, więc nie powinno być żadnych problemów z konwersją).
Gdy zaś zamiast PictureBox.Load ładuję plik jedną z następujących metod:
pbWallpaper.ImageLocation = dlgOpen.FileName;
pbWallpaper.Image = new Bitmap(dlgOpen.FileName);
pbWallpaper.Image = Image.FromFile(dlgOpen.FileName);

to owy problem w ogóle nie występuje. Jednyna wskazówka, jaką znalazłem na stronie http://support.microsoft.com/kb/814675/en-us , dotyczy próby zapisu do tego samego pliku co otwarty (u mnie zapisuje do innego).
Co może być przyczyną takiego zachowania ? Dodam jeszcze, że ładowanie pierwszym sposobem (PictureBox.Load) plików typu png lub bmp nie powoduje żadnych kłopotów podczas zapisywania do dowolnego formatu.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Esidar

  • Użytkownik

# Wrzesień 07, 2008, 22:32:17
PictureBox ma dziwną właściwość, że blokuje plik który mu się wskaże do załadowania. Takiego pliku nie można ponownie otworzyć albo zapisać aż do czasu zamknięcia aplikacji. 

Offline Coristo

  • Użytkownik

# Wrzesień 07, 2008, 22:51:28
Problem w tym, że tak załadowany jpeg mogę zapisać jako BMP, ale przy próbie zapisania jako jpg lub png rzuca wyjatek. Nie zapisuję go pod tą samą nazwą, więc blokada raczej nie ma na to wpływu.

Offline BTM

  • Użytkownik

# Wrzesień 07, 2008, 23:00:27
Problem w tym, że tak załadowany jpeg mogę zapisać jako BMP, ale przy próbie zapisania jako jpg lub png rzuca wyjatek. Nie zapisuję go pod tą samą nazwą, więc blokada raczej nie ma na to wpływu.

A w opisie wyjątku nie ma powodu?

Offline Coristo

  • Użytkownik

# Wrzesień 07, 2008, 23:12:06
W dodatkowych informacjach mam nic nie mówiące mi hasło "W interfejsie GDI+ wystąpił błąd rodzajowy".

Offline revo

  • Użytkownik

# Wrzesień 08, 2008, 13:46:53
Ja to zwykle rozwiązuję mniej więcej tak:

using (Bitmap bmp = Bitmap.FromFile(fileName) as Bitmap)
{
    pictureBox.Image = new Bitmap(bmp);
}

Offline Dab

  • Redaktor
    • blog

# Wrzesień 08, 2008, 14:27:41
Skopiuj sobie kod metody PictureBox.Load() (którą wywołuje zarówno set_ImageLocation jak i Load(String) -- ale ten drugi dodatkowo wywołuje ten pierwszy) i zobacz co powoduje błąd. Ale jeżeli bez korzystania z Load(String) wszystko działa, to czym się martwić :)

Offline Coristo

  • Użytkownik

# Wrzesień 08, 2008, 15:29:27
Skopiuj sobie kod metody PictureBox.Load() (którą wywołuje zarówno set_ImageLocation jak i Load(String) -- ale ten drugi dodatkowo wywołuje ten pierwszy) i zobacz co powoduje błąd. Ale jeżeli bez korzystania z Load(String) wszystko działa, to czym się martwić :)
Ot, poprostu czysta ciekawość :]
Samo ustawienie ImageLocation nie wywołuje błedu (zapisuje plik bez problemów). Lecz gdy po ustawieniu ImageLocation wywołam w metodzie ładującej funkcję PictureBox.Load() to już wyjątek jest rzucany podczas zapisu do jpega (lub png).
Debugger mówi mi, że z metody PictureBox.Image.Save wyjątek rzuca "PropertyIdList" oraz "PropertyItems".