CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - "Sumowanie" bitmap

"Sumowanie" bitmap

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

"Sumowanie" bitmap

Nowy postprzez Slynx » czwartek, 2 czerwca 2011, 09:23

Mam pewne dwa obrazki (obiekt "b" i "b2") reprezentowane przez dwa obiekty typu bitmap, obydwa o rozmiarach 300x100(24 bitowe). Są puste czyli całe czarne w tle.
Wewnątrz pętli rysowane są losowe piksele koloru białego. Obydwa wyświetlane są w 2 komponentach typu PictureBox1.

Tworzony jest jeszcze jeden obraz (b3), który jest maską, też jest cały czarny, a potem rysowany jest pewien tekst (DrawString) w kolorze niebieskim. Obrazek jest ponownie przepisywany do obiektu b3.
Ostatecznie pobieramy x i y wszystkich punktów tego obrazka w tym kolorze, czyli moglibyśmy stworzyć coś na kształt tablicy ze współrzędnymi narysowanego Stringa.

W mojej pętli na przemian dane punkty są rysowane raz na jednym obrazku, raz na drugim, uzupełniając braki kolorem przezroczystym (transparent). Efektem nałożenia dwóch picture box na siebie powinno być odtworzenie napisu narysowanego na obiekcie b3 za pomocą funkcji DrawString. Problem jest chyba z przezroczystością koloru, ale nie wiem dlaczego.
Pętla którą stworzyłem powinna wypełnić wszystkie piksele kolorem na przemian raz dla jednego raz dla drugiego obrazka, a żeby uzyskać efekt nakładania obrazek nadrzędny ma resztę pikseli wypełnionych kolorem przezroczystym.
Sam komponent pictureBox też ma tło ustawione na przezroczyste.
Więc, co robię nie tak ?

KOD cpp:     UKRYJ  
                                 System::Drawing::Bitmap ^ b = gcnew System::Drawing::Bitmap(300, 100, System::Drawing::Imaging::PixelFormat::Format24bppRgb);
                                 System::Drawing::Bitmap ^ b2 = gcnew System::Drawing::Bitmap(300, 100, System::Drawing::Imaging::PixelFormat::Format24bppRgb);

                         for (int x = 0; x < 300; x++)
                         {
                                 for (int y = 0; y < 100; y++)
                                 {
                                         b2->SetPixel(rand->Next(300), rand->Next(100), System::Drawing::Color::White);
                                         b->SetPixel(rand->Next(300),rand->Next(100), System::Drawing::Color::White);
                                 }
                         }
                         
                         System::Drawing::Bitmap ^ b3 = gcnew System::Drawing::Bitmap(300, 100, System::Drawing::Imaging::PixelFormat::Format24bppRgb);
                         System::Drawing::Image ^ ix = (System::Drawing::Image^)b3;
                         System::Drawing::Graphics ^ g = System::Drawing::Graphics::FromImage(ix);

                         
                         
                         g->DrawString("Something", gcnew System::Drawing::Font("Tahoma", 40,System::Drawing::FontStyle::Bold), Brushes::Blue, 20, 20);
                         g->DrawImage(ix, System::Drawing::PointF(0, 0));
                         b3 = (System::Drawing::Bitmap^)ix;

                         for (int x = 0; x < 300; x++)
                         {
                                 for (int y = 0; y < 100; y++)
                                 {
                                         
                                         if (b3->GetPixel(x, y).B > 0)
                                         {
                                                 if (xx == 0 )
                                                 {
                                                         b->SetPixel(x,y,System::Drawing::Color::Black);
                                                }
                                                 else
                                                 {
                                                         b->SetPixel(x,y, System::Drawing::Color::Transparent);
                                                         b2->SetPixel(x,y,System::Drawing::Color::Black);
                                                 }
                                                 xx++;
                                                 if (xx == 2) xx = 0;
                                         };
                                 };
                         };
                         pictureBox1->Image = (System::Drawing::Image^)b;
                                 pictureBox2->Image = (System::Drawing::Image^)b2;
                                pictureBox1->Location = pictureBox2->Location;
 

Obrazek
Obrazek
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: "Sumowanie" bitmap

Nowy postprzez Slynx » czwartek, 2 czerwca 2011, 09:52

Już chyba wiem. To wynika z faktu, że sam komponent nie może uzyskać koloru przezroczystego. Muszę koniecznie pracować na jednym komponencie, chociaż to będzie trochę trudniejsze : /

///
Nie, nic z tego. To jednak nie o to chodziło. Nadal nie chce nakładać bitmap.
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: "Sumowanie" bitmap

Nowy postprzez Cyfrowy Baron » czwartek, 2 czerwca 2011, 10:55

Komponent udostępnia tylko powierzchnię do rysowania. Nie da się z dwóch komponentów stworzyć obrazka składającego się z warstw àlà Photoshop. Wszystko trzeba rysować nie tylko na jednej powierzchni, czyli jednym obiekcie, ale też łączyć na jednym płótnie TCanvas. Zresztą już kiedyś przez to przechodziliśmy przy okazji innego wątku.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: "Sumowanie" bitmap

Nowy postprzez Slynx » czwartek, 2 czerwca 2011, 13:28

Masz na myśli
KOD cpp:     UKRYJ  
                System::Drawing::Bitmap ^ exit = gcnew System::Drawing::Bitmap(300, 100, System::Drawing::Imaging::PixelFormat::Format24bppRgb);
                        for (int x = 0; x < 300; x++)
                        {
                                for (int y = 0; y < 100; y++)
                                {
                                        exit->SetPixel(x, y, b->GetPixel(x,y)); //b - pierwsza bitmapa z "połową" stringa
                                        exit->SetPixel(x, y, b2->GetPixel(x,y)); // b2 - druga bitmapa z drugą z resztą stringa + pierwsza połowa jako transparent color.

                                }
                        }
                         pictureBox1->Image = (System::Drawing::Image^)exit;
 

Mówiąc połowa stringa mam na myśli, połowę pikseli składających się na string.

Zresztą już kiedyś przez to przechodziliśmy przy okazji innego wątku.

Jakiś link ? Bo już nie pamiętam gdzie.
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: "Sumowanie" bitmap

Nowy postprzez Cyfrowy Baron » piątek, 3 czerwca 2011, 09:07

Chodziło mi o to, że masz np. dwie bitmapy i jeżeli chcesz je nałożyć na siebie to musisz je dorysować na jednej powierzchni TCanvas. Jeżeli bitmapy mają się przenikać, to należy określić najpierw stopień przenikania. Przenikanie to będzie średnia wyciągnięta z pikseli znajdujących się w tych samych współrzędnych.

Próbujesz zrobić sobie Captcha, więc nie wie, po co tak kombinujesz. Stwórz bitmapę z tekstem, a potem narysuj na niej losowe punkty i kreski, i gotowe...

Slynx napisał(a):Jakiś link ? Bo już nie pamiętam gdzie.


Sprawdziłem ten wątek i okazuje się, że to nie Ty go tworzyłeś. W wątku o którym wspomniałem chodziło o rysowanie i poruszanie obiektem po powierzchni zawierającej bitmapę, czyli o nakładaniu jednej grafiki na drugą.
Chodziło mi o ten wątek: Przyspieszenie wyświetlania na ekranie
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: "Sumowanie" bitmap

Nowy postprzez Slynx » niedziela, 5 czerwca 2011, 09:34

Nie, nie robię Captchy. Chcę spróbować stworzyć pewien efekt, który kiedyś gdzieś widziałem, czyli ukrywanie tekstu w obrazkach, które wyglądają na kompletnie bezsensowne. Oczywiście tutaj wszystko widać, ale to jest tylko próba.

Ale co do tego ma przenikanie ? Nie powinno wystarczyć ustawienie koloru przezroczystego dla tej grafiki która będzie na górze ? Efektem powinno być zwykłe dopasowanie brakujących pikseli. Przecież po to są kolory przezroczyste :/
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: "Sumowanie" bitmap

Nowy postprzez Cyfrowy Baron » niedziela, 5 czerwca 2011, 09:44

Robiłem swego czasu coś takiego. Ukrywać można tekst tylko w bitmapach, gdyż nie podlegają kompresji. Sztuka polega na zmianie dwóch ostatnich nieznaczących bitów każdego bajta. To nie ma nic wspólnego z przetwarzaniem grafiki.

Do zapisania jednego bajta tekstu (8 bitów) potrzeba czterech bajtów z bitmapy, gdyż jak napisałem wyżej wykorzystuje się tylko dwa ostatnie bity każdego bajta, a na jeden bajt potrzeba 8 bitów, stąd cztery bajty bitmapy.

jak znajdę ten kod to go zamieszczę.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: "Sumowanie" bitmap

Nowy postprzez Slynx » niedziela, 5 czerwca 2011, 09:54

Kompletnie nic z tego nie rozumiem.
A nie można by tego zrobić z zastosowaniem koloru przezroczystego w jakiś sposób ? Przypominam, że te bitmapy są generowane w trakcie działania programu, więc mogą przyjąć każde opcje/właściwości

Aaa... już rozumiem o czym Ty mówisz. Nie, nie o to mi chodziło ; p

Mówiłem o bardzo "obrazowym" ukrywaniu tekstu. To o czym Ty mówisz... pamiętam, kiedyś chciałem to zrobić, właśnie dlatego, że zauważyłem, że pewne dane są niewykorzystywane (dokładniej to wyjaśniłeś).
To może pomińmy to ukrywanie tekstu, załóżmy, że po prostu chcę na siebie nałożyć dwa obrazki tak by górny miał przezroczysty fragment.
No przecież wiesz o co mi chodzi... :/
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: "Sumowanie" bitmap

Nowy postprzez Cyfrowy Baron » niedziela, 5 czerwca 2011, 10:10

Slynx napisał(a):Kompletnie nic z tego nie rozumiem.


No cóż, możliwe, że nie rozumiem co Ty chcesz osiągnąć.

To co opisałem polega na tym, że masz np. jakiś zwykły tekst, np. w pliku tekstowym. W programie wczytujesz ten tekst oraz wczytujesz sobie jakąś bitmapę i wplatasz ten tekst w bitmapę. Takie wplecenie tekstu nie wpływa na wygląd bitmapy, nie zmienia również jej rozmiaru, ale używając swojego programu i funkcji odwrotnej do wplatającej, możesz wydobyć tekst, który wprowadziłeś do bitmapy.

To takie ukrywanie tekstu w bitmapie.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: "Sumowanie" bitmap

Nowy postprzez Slynx » niedziela, 5 czerwca 2011, 10:32

To rozumiem, to robiłem kiedyś (ale nie zrobiłem ostatecznie). Tym razem chodzi mi o efekt graficzny. Był taki świetny. Pokazałbym Ci, ale nie mam pojęcia gdzie go widziałem.
Dokładniej są 4 bitmapy z (pozornie) losowo rozrzuconymi punktami, kompletna "sieczka" białych i czarnych pikseli, ale gdy te 4 obrazki się na siebie nałożą to te piksele się uzupełnią się nawzajem i powstanie napis. Bardzo fajnie to wygląda. Dlatego właśnie uznałem, że mają się nakładać, to każdy z tych 4 obrazków zawiera 1/4 wszystkich pikseli potrzebnych na ułożenie napisu, a 3/4 tych pikseli jest wypełnionych kolorem przezroczystym tak by umożliwić pozostałym obrazkom dołączenie swojej części. (jakby te 3/4 pikseli miały konkretny kolor to po nałożeniu nadal byłby widoczny tylko jeden obrazek)
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: "Sumowanie" bitmap

Nowy postprzez Cyfrowy Baron » niedziela, 5 czerwca 2011, 10:46

Slynx napisał(a):To rozumiem, to robiłem kiedyś (ale nie zrobiłem ostatecznie).


A ja już znalazłem ten projekt.



Co się tyczy Twojego problemu, to trzeba by wyjść od gotowej grafiki a potem podzielić ją na 4 inne grafiki. Problem stanowi losowość tych grafik, gdyż przy losowaniu piksele mogą się powtarzać.

Ja swego czasu robiłem coś w tym stylu ► patrz serwis: Cyfrowy Baron dział: porady -> ciekawostki -> mieszanie grafiki, czyli psucie obrazka.

Niestety! Właśnie kończę trzecie piwo i mam problemy z trafianiem w klawisze, że nie wspomnę o logicznym myśleniu, więc na dziś już kończę. :x
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: "Sumowanie" bitmap

Nowy postprzez Slynx » niedziela, 5 czerwca 2011, 11:14

Niestety! Właśnie kończę trzecie piwo i mam problemy z trafianiem w klawisze, że nie wspomnę o logicznym myśleniu, więc na dziś już kończę.


Przecież jeszcze nie ma 12 ?!
To jakaś niezła okazja musiała być, żeby złamać zasadę "nie piję przed 12".
Jak znowu zauważysz, że klawiatura ma więcej niż jeden przycisk to daj znać :D

Co do losowości pikseli, to tym sie nie przejmuj. Na razie załóżmy, że wartości (x i y) parzyste należą do 1 obrazka a wartości nieparzyste należą do drugiego obrazka. Jedynym problemem jest to (o, w końcu wiem w czym jest problem), że gdy na jednym obrazku ustawimy kolor przezroczysty a potem tym obrazkiem przykryjemy inny to tego innego nie będzie widać, mimo przezroczystego koloru.
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: "Sumowanie" bitmap

Nowy postprzez Cyfrowy Baron » niedziela, 5 czerwca 2011, 11:42

Może coś ze sterowaniem CopyMode:

KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 Graphics::TBitmap *bImage1 = new Graphics::TBitmap();
 bImage1->Width = 100;
 bImage1->Height = 100;
 bImage1 = Image1->Picture->Bitmap;


 Graphics::TBitmap *bImage2 = new Graphics::TBitmap();
 bImage2->Width = 100;
 bImage2->Height = 100;
 bImage2 = Image2->Picture->Bitmap;

 Graphics::TBitmap *OutputBitmap = new Graphics::TBitmap();
 OutputBitmap->Width = 100;
 OutputBitmap->Height = 100;

 OutputBitmap->Canvas->Draw(0, 0, bImage1);

 OutputBitmap->Canvas->CopyMode = cmSrcPaint;

 OutputBitmap->Canvas->Draw(0, 0, bImage2);

 Image3->Picture->Bitmap = OutputBitmap;
}



Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje multimedialne, graficzne

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 2 gości