Obrazki i zajetość pamięci.

0

Witam,

mam dwa problemy, na które do tej pory nie udało mi się znaleźć odpowiedzi, nawet na tym forum.

Po pierwsze.

Wczytując obrazy z listy plików i umieszczając je w pictureBox poprzez:
pictureBox.Image = Image.FromFile(sciezka)
za każdym razem kolejny obraz dodawany jest do pamięci. Nie wiem, jak zrobić aby nowo wybrany i wczytany obraz był umieszczany w pamięci w miejsce poprzedniego.
Wyczytałem na tym forum, ze metoda Dispose() tak naprawdę nic nie robi i faktycznie tak jest.
Ktoś może podsunąć jakieś rozwiązanie tego problemu ?

I po drugie.
Wczytuje pliki jpg. Teoretycznie wszystkie są w odpowiednim formacie. Czasami zdarza sie tak, ze w katalogu znajduje się plik z rozszerzeniem jpg ale nie jest to plik graficzny tylko jakiś zupełnie inny typ, który nie wiadomo skąd posiada rozszerzenie jpg. Jak można sprawdzić nie biorąc pod uwagę rozszerzenia czy dany plik jest odpowiedniego formatu (w tym przypadku jpg)? Podczas wczytywania tych pseudo plików jpg występuje wyjątek OutOfMemmoryException mimo iz plik zajmuje ok. 100KB. Przechwycenie wyjątki nie za bardzo załatwia całą sprawę.

Z góry dziękuję za odpowiedź na któryś z powyższych problemów.

Pozdrawiam
wronek

0
  1. Framework sam sobie zwolni pamiec, jesli uzna, ze jest to potrzebne (np. braknie na inne)

  2. Wlasnie po to rzucany jest wyjatek, zebys wiedzial, ze cos jest nie tak. Czemu przechwycenie wyjatku nie zalatwia sprawy? OutOfMemoryException moze byc rzucany z tego wzgledu, ze starajac sie przeczytac plik, program rezerwuje sobie pamiec na caly plik czytajac domniemana rozdzielczosc pliku (np. 10tysx10tys). Z tym wyjatkiem pamieci akurat zgaduje, bo powinien byc inny wyjatek, typu InvalidFormatException.

//edit
Wszystko ok:

msdn napisał(a)

OutOfMemoryException
The file does not have a valid image format.

-or-

GDI+ does not support the pixel format of the file.

0

No troche mnie to uratowalo :)
Ale to dziwne, ze przy zlym formacie pliku zwracany jest taki wyjatek.
Nadal obawiam sie troche tej zajetosci pamieci. Program usuwa te pliki, ktore nie sa poprawnymi plikami jpg. Jesli Framework nie zdarzy zwolnic odpowiednio wczesnie pamieci to hipotetycznie moze zdarzyc sie taka sytuacja ze w przechwyconym wyjatku OutOfMemmoryException moge usunac dobry plik jpg, dla ktorego wlasnie zabraklo pamieci.

0

Zobacz czy w samym wyjatku nie ma informacji o szczegolach wystapienia tegoz.

Jesli nie, to lepiej jakos inaczej sprawdzac czy plik jest poprawny, np. wedlug specyfikacji jpeg (typu poprawnosc naglowka, ilosc danych, itp)

0

No to tak, odnosnie zajetosci pamieci, to mozna uzyc:

GC.Collect();
GC.WaitForPendingFinalizers();

Bardzo ladnie zwalnia pamiec zajmowana przez obiekty.

Co do wyjatku to nic nowego.

Jeszcze raz dzieki za pomoc :)

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