C# - Nakładanie zdjęcia png na jpg w picturebox

0

Witam
Mam taki problem, pisze program dla śmiesznych zdjęć wczytywanie pliku jpg do picturebox realizuję poprzez

 OpenFileDialog otworz_plik = new OpenFileDialog();
            otworz_plik.Filter = "Pliki graficzne |*.jpg; *.tiff; *.raw";
            if (otworz_plik.ShowDialog() == DialogResult.OK)
            {
                pictureBox1.Image = Image.FromFile(otworz_plik.FileName);
}

Ładuje mi dowolne zdjęcie, teraz chciałbym z przycisku np. dodać "śmieszne wąsy", "czerwony nos", "słoniowe uszy" itp.
grafiki są przygotowane w png bez tła i kiedy wywołuję funkcję:
pictureBox1.Load("smieszne\\wasy.png");
lub
pictureBox1.Image = new Bitmap("smieszne\\czerwonynos.png");
Zdjęcie główne mi po prostu znika i pojawia się samo png, co trzeba zrobić żeby png został nałożony na jpg i żeby oba zdjęcia było widać?
Jaką funkcją np. zrobić "zdejmij nos" i zostanie samo zdjęcie jpg ?
Będę bardzo wdzięczny za pomoc.
Pozdrawiam bardziej doświadczonych.

0

Stwórz jedno płótno czy warstwę po prostu i na nią rysuj wszystkie inne obrazy lub dalsze warstwy. PictureBox może być płótnem i za pomocą albo następnym kontrolek PictureBox, które mogą być "nałożone" na płótno, dodaj te obrazki. Możesz też posłużyć się klasą Graphics i rysować wszystko na jednym PicureBox.

0

Wolałbym się posłużyć funkcją Graphics żeby móc wszystko zrealizować w jednym Picturebox spod buttona
klikne pokaż nos i łąduje mi nos na istniejące zdjęcie.
klikne np na button śmieszne wąsy i na zdjęciu pokażą się śmieszne wąsy. tylko jak to zrealizować za pomocą kodu nie mam zielonego pojęcia, bardzo bym prosił o jakiś przykład.

1

Kod na rysowanie po kontrolce byłby taki:

Graphics g = pictureBox1.CreateGraphics();
g.DrawImage(Image.FromFile("nos.png"), 0, 0);

Wszystkie przeciążone metody DrawImage są tu: http://msdn.microsoft.com/en-us/library/system.drawing.graphics.drawimage.aspx

Klasę Graphics opisałem w artykule Rysowanie po Windows Forms. Są tam potrzebne rzeczy takie jak skalowanie itd.

0

dobrze jeśli mam teraz coś takiego...

 Graphics rozsmiesz = pictureBox1.CreateGraphics();
            rozsmiesz.ScaleTransform(0.68f, 0.74f);
            rozsmiesz.DrawImage(Image.FromFile("smieszne\\czerwonynos.png"), 0, 0);

Jak spod innego przycisku ukryć czerwony nos tak żeby główne zdjęcie zostało otwarte ?
albo mi sie wydaje albo trzeba zamknąć plik prawda ?

Update już mam.
picturebox.invalidate();
ale niezupełnie o to mi chodziło, bardziej o to żeby spod drugiego przycisku zamykało wszystkie pliki *.png

0

Jeżeli to mają być warstwy i chcesz je ukrywać, to musisz napisać mechanizm warstw. Teraz klasą Graphics tylko nadpisałeś obszar na starym jpg i już nic nie zrobisz. Jeżeli zależy Ci na jednym PictureBox to musisz napisać ten mechanizm warstw, ale można to zrobić inaczej, za pomocą wielu PictureBox, nałożonych na siebie.

0

w zasadzie program działa na innej zasadzie.... poszczególne warstwy png mogą sobie znikać za pomocą picturebox1.invalidate(); chodzi generalnie o to że chce zrobić przesterowanie w zależności od tego gdzie klikne np. nos będzie przycisk "pokaz smieszny efekt". jeżeli klikne na uszy pojawi sie inny efekt, kwestia stawiania warunków if. Chodzi w zasadzie o przetrzymywanie informacji o klikniętych punktach(współrzędnych x,y(obszar początkowy); xy(obszar końcowy)) jeszcze sie zastanawiam co jest lepsze czy przetrzymywanie konkretnego punktu w tablicy czy zakresu obszaru w którym się znajdują. tylko jak te współrzędne zadeklarować ? jakaś funkcja PolygonRegion jest ? mała podpowiedź jak to można ugryźć ?

0

Idealne zastosowanie dla wzorca projetkowego zwanego dekoratorem :). Polecam książkę (C# 3.0 design patterns). Jest tam właśnie taki przykład z dekorowaniem obrazka.

0

ok powiedzmy że ta książka nie jest dla mnie nie chce stworzyć albumu zdjęć
jak rozwiązać zaczytanie punktów do tablicy ?

 

    richTextBox1.Clear();
                    richTextBox1.AppendText("Pamiętaj by zaznaczyć tylko 4 punkty");
                    punktuj.DrawEllipse(new Pen(Color.OrangeRed, 2), new Rectangle(x - 2, y - 2, 4, 4));
                    int[,] punkt_pozycji_XY;
                    punkt_pozycji_XY = new int[3,3];

    punkt_pozycji_XY = // punktuj;

Nie moge tego rozgryźć, ostatnia linijka mi zwraca błąd, że nie może przekonwertować Graphics do int
co z tym fantem można zrobić ?

0

Nic nie rozumiem. Jakie punkty konkretnie chcesz zapisać do tablicy?

0

chce żeby mi zaczytało kliknięte miejsca na picturebox do tablicy
kombinuje coś w ten deseń z metody picturebox_Mouseclick

 int[,] klik_w_poz_XY = new int[4,4];
                klik_w_poz_XY[0, 0] = e.Button = MouseButtons.Right(x, y);
                klik_w_poz_XY[1,1] = MouseClick(x,y);
                klik_w_poz_XY[2,2] = MouseClick(x,y);
                klik_w_poz_XY[3,3] = MouseClick(x,y);

ale czepia sie mnie, że "Error 1 'System.Windows.Forms.Control.Left' is a 'property' but is used like a 'type'
Error 4 The event 'System.Windows.Forms.Control.MouseClick' can only appear on the left hand side of += or -=
Już nie mam pojęcia o co mu dalej chodzi żeby było git.

0

ok mam połowicznie się udało rozwiązać zaczytywanie współrzędnych do Tablicy, połowicznie dlatego że jak klikam gdziekolwiek to Tablica zwraca mi we wszystkich 4 polach te same wartości. jak zrobić żeby każde pole zwróciło inną wartość współrzędnych a nie za każdym klikiem wskakiwało to samo we wszystkie pola zwrotne ? w zasadzie już mam określone każdy punkt inny.
czekajcie na newsa :)

0

Metoda

 public partial class Form2:Form
{
string[,] klik_w_poz_XY = new string[4, 4];

Posiadam sobie taką tablicę

jej wartości przechwytuję do textboxów z metody

 private void pictureBox1_MouseClick(object sender, MouseEventArgs e)

Wiecie może jak porównać określony obszar roboczy na podstawie współrzędnych z tablicy i współrzędnych sztywno określonych przeze mnie w metodzie Button_click?
np. wyznaczam sobie granice obszaru 5 kwadratów jeśli klikniesz w kwadrat 1 = 183, 0 && 577, 553 (są to pozycje XY określonego kwadratu na sztywno) picturebox pokaże Ci zdjęcie1, jeśli w kwadrat 2 = 0,0 && 183,277 picturebox pokaże Ci zdjęcie2 itd.

dlaczego np. nie można zrobić czegoś takiego do jednego zdjęcia i podobnych współrzędnych do wyświetlenia drugiego zdjęcia ? Przecież chodzi tylko o porównanie danych ale z tablicy stringów niby tak nie można :( da sie to jakoś inaczej rozwiązać spod buttona ?

  if ((textBox3.Text = String.Format("X, Y= {0}", klik_w_poz_XY[0, 0])) > (klik_w_poz_XY[0, 0] = String.Format("{0}, {1}", 183, 0)))
 if ((textBox4.Text = String.Format("X, Y= {0}", klik_w_poz_XY[1, 1])) > (klik_w_poz_XY[1, 1] = String.Format("{0}, {1}", 577, 0)))
 if ((textBox5.Text = String.Format("X, Y= {0}", klik_w_poz_XY[2, 2])) < (klik_w_poz_XY[2, 2] = String.Format("{0}, {1}", 183, 553)))
 if ((textBox6.Text = String.Format("X, Y= {0}", klik_w_poz_XY[3, 3])) <  (klik_w_poz_XY[3, 3] = String.Format("{0}, {1}", 577, 553)))
{
               smieszne.DrawImage(Image.FromFile("smieszne\\pomarszczona_twarz.png"), 0, 0);
            }
            else 
            {
                smieszne.DrawImage(Image.FromFile("smieszne\\mega_uszy.png"), 0, 0);
            }

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