Witamy na Delphi - forum dla programistów, webmasterów i grafików
+ Odpowiedz na ten temat
Pokaż wyniki od 1 do 3 z 3
  1. #1

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



  2. #2

    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.

  3. #3

    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


 

Bookmarks

Uprawnienia

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
Do góry

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19