Witam
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.
Witam
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.
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
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…
A i jeszcze taka mała prośba 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ę Głównie chodzi mi o to żeby jakoś okiełznać te logo intela i zrobić że się nie rozciągało tak xD
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
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ć.