C# powiększanie bitmapy

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ć.

0

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

0

Da się to zastosować do trackbar'a ?

0

Nie rozumiem?

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 ?

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.

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

        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.

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.

0
        
        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.

0
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 */ );


        } 
if (ob.ShowDialog() == DialogResult.OK)
            {
                bmp = new Bitmap(ob.FileName);
            }
0
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.

0

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

0

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

0

daj caly kod bo moze cos pomieszalismy ;]

0
        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.

0

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

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 ?

0

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

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.

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.

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

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.

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)

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 ?

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

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.

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

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.

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

0

U mnie to wygląda tak:

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

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