[C#] Problem z Bitmap, 200MB zdjecia

0

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.

            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");
            }

Z góry dzięki za jakiekolwiek wskazówki.

0

Używanie GetPixel i SetPixel to bardzo nieefektywna metoda już przy małych obrazach. Dla większych lepiej używać klasy BitmapData, LockBits i tablicy bajtów...
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.

0

modyfikacja kolegi powyżej 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

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

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