[VB] Problem z przezroczystością PicturesBox

Witam :slight_smile:

Mam problem z przezroczystością kontrolki PicturesBox.

Te 2 obrazki są w PNG, (ten kabel i logo intel).

Dokładnie chodzi mi o to:

http://wstaw.org/images/free/2009/04/20 … 3f92b.jpeg

Pozdrawiam.

PictureBox1->Image->MakeTransparent(KOLOR_KTORY_MA_BYC_PRZEZROCZYSTYM);

Tak właśnie mam, i niestety, ale dzieje się to co jest na dołączonym obrazku

A dokładnie:

W MakeTransparent() ma być podany kolor obrazka który działa za przezroczysty. Przy wczytywaniu png do bitmapy jest ona konwertowana na BMP więc nie ma koloru przezroczystego, chyba że zastosujesz inne wczytywanie, szukaj w konstruktorach bitmapy.

Ok wziąłem innym plik, bitmapę.

zrobiłem MakeTransparent(Color.White)

wyciął te białe, i wstawił zamiast tego kolor który jest pod tym obrazkiem kabla.

#!@$#@!$#@!$@#, czy M$ ma coś co nie jest schrzanione?

http://www.freevbcode.com/code/TrnspBox.zip

w tym pliku występują błędy w kompilatorze…

nie wiem może ja coś źle robię, ale to może wina tego że mam tylko wersje VB 2008 Express Edition

A jak to ma działać?! To autor źle napisał! Wczytuje zblitowany obrazek i chce by po wywołaniu MakeTransparent w miejsce białego tła wstawiło się coś, czego w obrazku nie ma zapisanego. Następnym razem radzę się zastanowić trochę bardziej, bo teraz się ośmieszasz.

Do autora: Załaduj oba obrazki(jaki bitmapy, nie do PictureBoxów), na drugim wywołaj MakeTransparent, zblituj je(Graphics.DrawImage) i wrzuć do PictureBox. Jeśli chcesz nałożyć na siebie PBoxy to przeładuj w klasie dziedziczącej metodę OnPaint.

No ok, jestem początkującym, a nawet bardzo użytkownikiem VB, wiec prosił bym o wytłumaczenie tego co napisał Fiołek.

To ten pierwszy sposób będzie prostszy(drugi też trudny nie jest, ale trzeba by pobawić się blendingiem).

Ładujesz obrazek tło(ten z RJ45), ładujesz obrazek do nałożenia(logo Intela), jeśli chcesz wyeliminować białe(255, 255, 255) tło, wywołujesz MakeTransparent z kolorem białym(Color.White), tworzysz obiekt Graphics obrazka tła(Graphics g = Graphics.FromImage(tlo)) i blitujesz(kopiujesz) obrazek drugi z pierwszym(g.DrawImage(logoIntel, Point(10, 10));). Na obrazku pierwszym widnieje teraz ładnie nałożone logo Intela, więc ustawiasz Image pictureBoxa na tlo. Gotowe :wink:

Radzę zapoznać się z komponentem TImage Delphi/BCB, wczytujesz sobie obrazek, ustawiasz jaki kolor ma działać za przezroczysty i więcej nic nie musisz robić. TImage sam sobie nadpisuje metodę OnPaint sam znajduje co jest pod nim itd. TImage - porządnie zrobiony komponent, PicturureBox - kolejny bubel od M$.

Ok, coś tam wyskrobałem… ale niestety nie działa. Tzn program się wywala w ostatniej linii. Coś źle zrobiłem.

Oto co wyskrobałem.

Dim rj45 As New Bitmap("C:\Users\Felek\Documents\rs.jpg")

        Dim g As Object

        Dim point As Point

        Dim logointel As New Bitmap("C:\Users\Felek\Documents\intel.bmp")

        logointel.MakeTransparent(Color.White)

        g = Graphics.FromImage(rj45)

        g.DrawImage(logointel, point)

        PictureBox1.BackgroundImage = g

@alex: Nie mam zamiaru babrać się w VCL, bo mi to nie potrzebne.

PictureBox ma działać jako zwykła kontrolka z nieprzeźroczystym tłem(bo takie są kontrolki w WF, choć można to zmienić), służy do wyświetlania obrazków, a nie bawienia się w grafika.

@autor: przypisujesz obrazek na którym malowałeś przez g.DrawImage a nie obiekt Graphics. Ostatnia linijka - zamiast “g” powinno być “rj45”.

:o nie no słodko… :smiley:

A i jeszcze taka mała prośba :smiley: jak zrobić żeby logo intela nie rozciągało się na całą szerokość picturebox?

EDIT:

szkoda, ale to i tak nie przejdzie… bo mi są potrzebne dwa Pictureboxy, gdyż do jednego picturebox (tło) jest wczytywany obrazek z pliku a później zapisywany w wybranym pliku. No chyba że znasz metodę na to żeby program zapisywał w pliku tylko samo tło bez loga.

EDIT2:

Chociaż nie, może zadziała jeszcze dokładnie sprawdzę :slight_smile: Głównie chodzi mi o to żeby jakoś okiełznać te logo intela i zrobić że się nie rozciągało tak xD

  • Nie, jednak zapisuje tło razem z logiem intela ;(

DrawImageUnscaled

ok, z wielkością loga git.

Ale teraz jak zrobić żeby tło nie zapisywało się razem z logiem ( przypominam że cel programu to wczytanie określonego jpg, a potem zapisanie plik *.jpg do wybranego katalogu)

Najprościej będzie wywołać File.Copy na pliku. Albo sklonować bitmapę przed nanoszeniem loga(Bitmap.Clone).

Kawałek kodu z tłem i logiem (problem nadal jest z tym logiem co, nadal nie mogę go “okiełznać”) co poprawić?

A tutaj kawałek kodu który zapisuje z Pictruesbox1

Co poprawić, co ująć, co dodać?

Ja już dziękuje za całą pomoc, ale jeszcze zostało to i obiecuje że daje spokój z tym :slight_smile:

Ten drugi PictureBox nie jest potrzebny, bo na tym pierwszym PB masz już połączony obrazek.

Jeśli chcesz zapisać oryginalny plik w innym miejscu, to albo go kopiujesz(Graphics nie nadpisuje pliku a obiekt!) metodą File.Copy(co tu nie będzie zawsze działać, może się różnić format pliku), albo tworzysz kopię(klon) wczytanego(oryginalnego) obrazka metodą Clone i zapisujesz ten klon.

Dim rj45 As New Bitmap(TextBox1.Text)

Dim g As Object

Dim t As New Rectangle(0, 0, 50, 50)

Dim logointel As New Bitmap("C:\Users\Felek\Documents\intel.bmp")

Dim rj45copy As Object

rj45copy = rj45.Clone()

logointel.MakeTransparent(Color.White)

g = Graphics.FromImage(rj45)

g.DrawImageUnscaled(logointel, t)

PictureBox1.Image = rj45

PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage

Zapisywanie:

Dim file As String = "C:\zdjecie.jpg"

rj45copy.Save(file)

MsgBox("Plik został zapisany", MsgBoxStyle.Information, "Infromacja")

No i się chyba różni bo jpg ani rusz… nawet textbox1.text nie chce ruszyć.