C# powiększanie bitmapy

C# powiększanie bitmapy
KA
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 12 lat
  • Postów:31
0

Witam. Jako że nie jestem jakimś pro w programowaniu w tym języku, postanowiłem zwrócić się tu do Państwa na forum.

Mój problem polega na tym że na zajęcia mam zrobić projekt oscylografu. Oscylograf rysuje się w picturebox'ie jako bitmapa.
Ale żeby nie był to prosty program ( bynajmniej dla mnie taki nie jest), to kazano mi do tego zrobić powiększanie, i przesuwanie tej powiększonej bitmapy. Nie bardzo mam pojęcie jak to zrobić. Przeszukałem trochę stron w googlach lecz i to nie dało mi odpowiedzi.
Widziałem sposoby na powiększenie polegające na ponownym rysowaniu tej bitmapy tylko ileś razy tam powiększonej według trackbar.value. Ale to tylko zżera pamięć. Proszę o pomoc i podpowiedź jak takie coś napisać.

Azarien
znaczy, ile tej pamięci zżera?
KA
nie powiem dokładnie ile, wiem że rysowanie w powiększeniu zajmuje sporo czasu. Widziałem działanie programów osób innych z grupy. Sam nauczyciel też to stwierdził.
UB
  • Rejestracja:około 17 lat
  • Ostatnio:ponad 7 lat
0

e.Graphics.ScaleTransform(float, float)
i TranslateTransform do przesuwania

edytowany 1x, ostatnio: ubuntuser
KA
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 12 lat
  • Postów:31
0

Da się to zastosować do trackbar'a ?

UB
  • Rejestracja:około 17 lat
  • Ostatnio:ponad 7 lat
0

Nie rozumiem?

KA
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 12 lat
  • Postów:31
0

No bo to ma działać na takiej zasadzie że jest picturebox, a pod nim trackbar (jako suwak powiększający ten obraz, zwiększający zoom). Więc pytam czy to da się w jakiś sposób zastosować do trackbar'a ?

UB
  • Rejestracja:około 17 lat
  • Ostatnio:ponad 7 lat
0

Daj to w obsłudze zdarzenia Paint w Pictureboxie. A skalę transformacji uzależnij od Trackbar.Value. W momencie przesunięcia trackbara (Trackbar.Scroll event) odśwież Picturebox.

KA
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 12 lat
  • Postów:31
0

Gdybyś mógł pomóc co źle robię co powinienem dodać, nie znam bardzo dobrze języka. A projekt jednak muszę na zaliczenie oddać. Mam coś takiego

Kopiuj
        public void trackBar1_Scroll(object sender, EventArgs e)
        {
            label1.Text = trackBar1.Value.ToString();

            int value = trackBar1.Value;

            if (trackBar1.Value > 1)
            {
                Graphics graph = Graphics.FromImage(bmp);
                graph.ScaleTransform(bmp.Width * trackBar1.Value, bmp.Height * trackBar1.Value);
                
                pictureBox1.Image = bmp;
                
            }

      }

bmp, to obraz wczytany przez openfiledialog. Myślałem że może w ten sposób podziała, ale po skompilowaniu, przesunięciu trackbar'a obraz znika w ogóle.

edytowany 1x, ostatnio: Kalysto
UB
  • Rejestracja:około 17 lat
  • Ostatnio:ponad 7 lat
0

Rysuj obraz dopiero w obsłudze zdarzenia Paint dla Pictureboxa za pomocą DrawImage.
Wtedy używasz e.Graphics co napisałem w 1 poście.
Przesuwanie możesz zrobić klawiszem myszki, będzie w sumie ciekawsze i lepsze niż scrollbarem i idealnie pasuje do tego co ci powiedziałem wcześniej.

KA
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 12 lat
  • Postów:31
0
Kopiuj
        
        OpenFileDialog ob;
        Bitmap bmp;
        public void button1_Click(object sender, EventArgs e)
        {

            ob = new OpenFileDialog();
            ob.Title = "Otworz obraz";
            ob.Filter = "All|*.*|jpeg|*.jpeg|jpg|*.jpg";
            ob.FileName = "";

            if (ob.ShowDialog() == DialogResult.OK)
            {
                pictureBox1.ImageLocation = ob.FileName;
                bmp = new Bitmap(ob.FileName);
                pictureBox1.Size = new Size(bmp.Width,
                bmp.Height);
            }

        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {

            Graphics graph = Graphics.FromImage(bmp);

            Point punkt = new Point(100,100);
            graph.DrawImage(bmp, punkt);
        } 

Mam coś takiego ale nie bardzo wiem jak połączyć openfiledialog z metoda picturebox1_paint żeby openfiledialog po naciśnieciu na button otwierał plik, i poprzez picturebox1_paint'a go wyświetlał. Nawet nie wiem czy dobrze ten DrawImage zastosowałem. Pomóż proszę. To nie jest kod do tego oscylografu. To jest do zwykłego obrazka. Staram się na tym skleić coś żeby potem to wmontować do oscylografu.

edytowany 2x, ostatnio: Kalysto
UB
  • Rejestracja:około 17 lat
  • Ostatnio:ponad 7 lat
0
Kopiuj
private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
 e.ScaleTransform(/*tu Trackbar.Value */ );
            e.Graphics.DrawImage(bmp /* tu pewnie jeszcze jakieś argumenty typu location, size, pisze z glowy */ );


        } 
Kopiuj
if (ob.ShowDialog() == DialogResult.OK)
            {
                bmp = new Bitmap(ob.FileName);
            }
edytowany 1x, ostatnio: ubuntuser
KA
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 12 lat
  • Postów:31
0
Kopiuj
public void button1_Click(object sender, EventArgs e)
        {

            ob = new OpenFileDialog();
            ob.Title = "Otworz obraz";
            ob.Filter = "All|*.*|jpeg|*.jpeg|jpg|*.jpg";
            ob.FileName = "";
            if (ob.ShowDialog() == DialogResult.OK)
            {
                bmp = new Bitmap(ob.FileName);

            }


        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {

            e.Graphics.ScaleTransform(bmp.Height * trackBar1.Value, bmp.Width * trackBar1.Value );
            e.Graphics.DrawImage(bmp, 100,100);
           
        }

Zrobiłem tak. Nie wiem czy dobrze. Ale tuż po otwarciu programu wyrzuca błąd że wartość bmp = null. Nawet buttona kliknąć nie można.

_13th_Dragon
Po otwarciu programu musisz zdążyć kliknąć button1 wskazać plik i nacisnąć ok przed pierwszym wywołaniem pictureBox1_Paint no ale jak nie jesteś Chuckiem Norrisem to zwyczajnie wstawić warunek omijający rysowanie bitmapy o ile nie jest jeszcze wybrana.
UB
  • Rejestracja:około 17 lat
  • Ostatnio:ponad 7 lat
0

no to daj to co jest w pictureBox1_Paint obecnie w ifie
if (bmp!=null)

KA
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 12 lat
  • Postów:31
0

Teraz w ogóle nie rysuje tej bitmapy. Nic nie rozumiem.

UB
  • Rejestracja:około 17 lat
  • Ostatnio:ponad 7 lat
0

daj caly kod bo moze cos pomieszalismy ;]

KA
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 12 lat
  • Postów:31
0
Kopiuj
        Bitmap bmp;
        Graphics graph;
        public void button1_Click(object sender, EventArgs e)
        {

            ob = new OpenFileDialog();
            ob.Title = "Otworz obraz";
            ob.Filter = "All|*.*|jpeg|*.jpeg|jpg|*.jpg";
            ob.FileName = "";
            if (ob.ShowDialog() == DialogResult.OK)
            {
                bmp = new Bitmap(ob.FileName);

            }


        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            if (bmp != null)
            {

                e.Graphics.ScaleTransform(bmp.Height * trackBar1.Value, bmp.Width * trackBar1.Value);
                e.Graphics.DrawImage(bmp, 0,0); //dawalem 100,100 tez bo nie wiem czy to zalezy od poczatku pictureboxa, czy formy
            }
        } 

Otwiera obrazki, ale to nie wygląda w ogóle jakby to były one.
Jakby bardzo powiększone.

edytowany 1x, ostatnio: Kalysto
UB
  • Rejestracja:około 17 lat
  • Ostatnio:ponad 7 lat
0

Co to znaczy "nie wygląda"?
Ile wynosi trackBar1.Value?
Usuń "Graphics graph;" na początku bo nie używasz.

KA
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 12 lat
  • Postów:31
0

Value = 1 dokładnie. Te obrazki wyglądają jakby były powiększone. I to znacznie więcej razy. Usuwałem z kodu ten * trackbar1.Value. Ale to nic nie zmienia. Hmm jak zrobić by picturebox był rozmiaru tego obrazu ?

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:4 dni
0

e.Graphics.ScaleTransform(trackBar1.Value, trackBar1.Value);


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
KA
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 12 lat
  • Postów:31
0
_13th_Dragon napisał(a):

e.Graphics.ScaleTransform(trackBar1.Value, trackBar1.Value);

Nie wyświetla w ogóle obrazka.

Obrazek 200x160 nie mieści się w pictureboxie 400x400.

KA
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 12 lat
  • Postów:31
0

Kompilator wyrzuca błąd że metoda posiada 4 argumenty. Widocznie za dużo.
Sam kod e.Graphics.ScaleTransform(bmp.Width >> 1, bmp.Height >> 1);
Nic nie zmienia.

edytowany 1x, ostatnio: Kalysto
UB
  • Rejestracja:około 17 lat
  • Ostatnio:ponad 7 lat
0

Nie wiem co kombinujesz, ale to co powiedziałem i co powiedział trzynasty smok w pierwszym poście, powinno już załatwić sprawę całkowicie. Skala x i y (czyli argumenty w nawiasie) to liczba typu float i jeśli wynosi 1, to obraz jest takiej samej wielkości.

Spróbuj dać
e.Graphics.ScaleTransform(1.5F, 1.5F);
i powiedz co widzisz

edytowany 1x, ostatnio: ubuntuser
KA
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 12 lat
  • Postów:31
0

Nic nie kombinuje. Mam picturebox'a kod cały macie wyżej. Zmieniałem tylko to co pisaliście czyli e.Graphics.ScaleTransform(bmp.Height * trackBar1.Value, bmp.Width * trackBar1.Value); na to co proponowaliście. Sam tego nie rozumiem dlaczego obraz o wymiarach 200x160 nie mieści się w pic o wymiarach 400x400.

ubuntuser napisał(a):

Nie wiem co kombinujesz, ale to co powiedziałem i co powiedział trzynasty smok w pierwszym poście, powinno już załatwić sprawę całkowicie. Skala x i y (czyli argumenty w nawiasie) to liczba typu float i jeśli wynosi 1, to obraz jest takiej samej wielkości.

Spróbuj dać
e.Graphics.ScaleTransform(1.5F, 1.5F);
i powiedz co widzisz

dałem przed tym
picturebox1.Refresh();
e.Graphics.ScaleTransform(1.5F, 1.5F);

i teraz jest cały obrazek.

edytowany 1x, ostatnio: Kalysto
unikalna_nazwa
  • Rejestracja:ponad 14 lat
  • Ostatnio:prawie 10 lat
0

no przecież jak dajesz
e.Graphics.ScaleTransform(bmp.Height * trackBar1.Value, bmp.Width * trackBar1.Value);

to przy obrazku 200x160 powiększasz go 160 razy w poziomie i 200 razy w pionie
i to jeszcze razy wartość trackbaru

zrób

e.Graphics.ScaleTransform(trackBar1.Value / trackBar1.Max * 1.5f + 0.5f, trackBar1.Value / trackBar1.Max * 1.5f + 0.5f);

gdzie 1.5f + 0.5f to maksymalne powiększenie (2x) a 0.5f to minimalne powiększenie (a właściwie pomniejszenie)


Pół giga extra na dropboxie? Pół giga extra na dropboxie! Tyle wygrać! >>Klik here<<
edytowany 3x, ostatnio: unikalna_nazwa
KA
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 12 lat
  • Postów:31
0
unikalna_nazwa napisał(a):

no przecież jak dajesz
e.Graphics.ScaleTransform(bmp.Height * trackBar1.Value, bmp.Width * trackBar1.Value);

to przy obrazku 200x160 powiększasz go 160 razy w poziomie i 200 razy w pionie
i to jeszcze razy wartość trackbaru

zrób

e.Graphics.ScaleTransform(trackBar1.Value / trackBar1.Max * 1.5f + 0.5f, trackBar1.Value / trackBar1.Max * 1.5f + 0.5f);

gdzie 1.5f + 0.5f to maksymalne powiększenie (2x) a 0.5f to minimalne powiększenie (a właściwie pomniejszenie)

Obrazek jest ale pomniejszony w tej chwili. Jak zrobić by był w oryginalnym rozmiarze i by trackbar odpowiadał za jego powiększenie ?

unikalna_nazwa
  • Rejestracja:ponad 14 lat
  • Ostatnio:prawie 10 lat
0
Kalysto napisał(a):

Obrazek jest ale pomniejszony w tej chwili. Jak zrobić by był w oryginalnym rozmiarze i by trackbar odpowiadał za jego powiększenie ?

nauczyć się czytać ze zrozumieniem


Pół giga extra na dropboxie? Pół giga extra na dropboxie! Tyle wygrać! >>Klik here<<
KA
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 12 lat
  • Postów:31
0
unikalna_nazwa napisał(a):
Kalysto napisał(a):

Obrazek jest ale pomniejszony w tej chwili. Jak zrobić by był w oryginalnym rozmiarze i by trackbar odpowiadał za jego powiększenie ?

nauczyć się czytać ze zrozumieniem

Przepraszam, już dopatrzałem. A druga część pytania? z tym trackbarem ? Przy wartości 10 (mam od 1 do 10 ustawione), dopiero powiększa się, przy mniejszych nic się nie dzieje.

edytowany 1x, ostatnio: Kalysto
unikalna_nazwa
  • Rejestracja:ponad 14 lat
  • Ostatnio:prawie 10 lat
0

zmień na
0.5f + 1.5f * trackBar1.Value / trackBar1.Maximum

lub zrzutuj jedną z wartości na (float)
bo inaczej wychodzi dzielenie całkowite

  • dodatkowo - to podejście zakłada że Minimum jest ustawione na 0, a nie na 1

albo łatwiej
zmień całość na:

trackBar1.Value

i będziesz miał powiększenie takie jaka wartość trackbara (od 1x do 10x)
tylko że wtedy nie będziesz miał możliwości zrobienia płynnego powiększenia


Pół giga extra na dropboxie? Pół giga extra na dropboxie! Tyle wygrać! >>Klik here<<
edytowany 3x, ostatnio: unikalna_nazwa
KA
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 12 lat
  • Postów:31
0
unikalna_nazwa napisał(a):

zmień na
0.5f + 1.5f * trackBar1.Value / trackBar1.Maximum

lub zrzutuj jedną z wartości na (float)
bo inaczej wychodzi dzielenie całkowite

albo łatwiej
zmień całość na:

trackBar1.Value

i będziesz miał powiększenie takie jaka wartość trackbara (od 1x do 10x)

Gdy jest e.Graphics.ScaleTransform(trackBar1.Value, trackBar1.Value); przy poruszaniu trackbarem rozmiar obrazka się nie zmienia.

edytowany 1x, ostatnio: Kalysto
unikalna_nazwa
  • Rejestracja:ponad 14 lat
  • Ostatnio:prawie 10 lat
0
Kalysto napisał(a):

Ale w przypadku gdy zmienię na trackbar1.Value obraz będzie znów te 200 razy powiększony. A nie wiem jak zrobić by ten trackBar1.Value o wartości 1 był równy wartości 1.0F.

nie, nie będzie
już ci się całkowicie miesza ;)

wtedy wpisywałeś bmp.Height - czyli powiększało tyle razy jaka była wysokość obrazka

Kalysto napisał(a):

Gdy jest e.Graphics.ScaleTransform(trackBar1.Value, trackBar1.Value); przy poruszaniu trackbarem rozmiar obrazka się nie zmienia.

u mnie jak najbardziej się zmienia
czy na pewno masz podpięte zdarzenie zmiany rozmiaru do onValueChanged trackbara?

jeśli masz go tylko do onPaint picturebox'a to rozmiar się zmieni dopiero po zasłonięciu i odsłonięciu okna aplikacji


Pół giga extra na dropboxie? Pół giga extra na dropboxie! Tyle wygrać! >>Klik here<<
edytowany 3x, ostatnio: unikalna_nazwa
KA
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 12 lat
  • Postów:31
0

U mnie to wygląda tak:

Kopiuj
public void button1_Click(object sender, EventArgs e)
        {

            ob = new OpenFileDialog();
            ob.Title = "Otworz obraz";
            ob.Filter = "All|*.*|jpeg|*.jpeg|jpg|*.jpg";
            ob.FileName = "";
            if (ob.ShowDialog() == DialogResult.OK)
            {
                bmp = new Bitmap(ob.FileName);

            }


        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {

            

            

            if (bmp != null)
            {


                    pictureBox1.Refresh();
                    
                    e.Graphics.ScaleTransform(trackBar1.Value * 0.5F +1.5f , trackBar1.Value * 0.5f +1.5f); //przy tym się powiększa z każdą wartością trackbar'a
                  //  e.Graphics.ScaleTransform(trackBar1.Value, trackBar1.Value); //przy tym wyrzuca błąd kompilatora "Parameter is not valid."
                    e.Graphics.DrawImage(bmp, 0, 0); //dawalem 100,100 tez bo nie wiem czy to zalezy od poczatku pictureboxa, czy formy
                

            }
        }

        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            label1.Text = trackBar1.Value.ToString();
        }
 

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.