-
15-09-2010 19:34 #1Junior Member
- Zarejestrowany
- Sep 2010
- Postów
- 13
Problem z dużymi zdjęciami, Bitmap
Jaka jest najlepsza i najbardziej efektywna droga do przetwarzania dużych zdjęć (200MB-300MB)?
W przykładzie poniższym, mam dwa zdjęcia. 2-gie zdjęcie maskuje pierwsze.
Problem w tym, że przy zapisie mam info, że brak pamięci (jak zdjęcie jest bardzo dużo to już na etepie tworzenia Bitmap jest info o braku pamięci). Czy jest jakaś alternatywa dla klasy Bitmap/Image?
Na mniejszych plikach wszystko działa.
Kod:string fname = @"mar.tif"; try { Bitmap bmp01 = new Bitmap(fname); use02(bmp01.Width.ToString()); //delegat use03(bmp01.Height.ToString()); //delegat Bitmap bmp02 = new Bitmap(@"cmar.tif"); for (int x = 0; x < bmp02.Width; x++) { for (int y = 0; y < bmp02.Height; y++) { Color c = bmp02.GetPixel(x, y); if (c.R == 255 && c.G == 255 && c.B == 255) { bmp01.SetPixel(x, y, Color.FromArgb(255, 0, 0, 0)); } } } bmp01.Save("result.tif", ImageFormat.Tiff); bmp01.Dispose(); catch { MessageBox.Show(String.Format("file {0}: out " + "of memory", fname), "Error"); }
-
16-09-2010 14:32 #2Junior Member
- Zarejestrowany
- Sep 2010
- Postów
- 21
Odp: Problem z dużymi zdjęciami, Bitmap
Używanie GetPixel i SetPixel to niezbyt efektywna metoda już przy małych obrazach. Dla większych lepiej używać klasy BitmapData, LockBits. Ale skoro w Twoim przypadku samo tworzenie obiektu zajmuje zbyt wiele pamięci, to i to nie pomoże, chyba należałoby przetwarzać pliki partiami, wczytując z dysku po kawałku i operując na "surowych" danych.
-
16-09-2010 14:39 #3Junior Member
- Zarejestrowany
- Sep 2010
- Postów
- 18
Odp: Problem z dużymi zdjęciami, Bitmap
Modyfikacja, o której pisał młody, przyspieszyłaby działanie programu jakieś 5-10 razy. Jeśli chodzi o brak pamięci to pomyśl sobie - jak TiFF o rozmiarze 300MB ładuje się do obiektu Bitmap to tak naprawdę następuje dekompresja TiFF - załaduj dwa takie rozpakowane obrazy do pamięci i ile Ci to zajmuje ?
Jeśli pierwszy obraz to tylko maska to mógłbyś użyć bitmapy 1bpp i nie będzie zajmowała tak ekstremalnie dużej ilości pamięci. Mam nadzieję, że choć trochę pomogłem.
nie unikniesz jednak potrzeby ładowanie obrazów po "kawałku" lub przesuwaniu się strumieniu w pliku.
jeśli masz określony format pliku łatwo będzie wyliczyć pozycje poszczególnych pikseli w strumieniu

LinkBack URL
About LinkBacks



Odpowiedź z Cytatem
Bookmarks