TImage i bitmapy

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

TImage i bitmapy

Nowy postprzez duf » sobota, 29 maja 2010, 21:39

Mam kontener vector z kilkoma obiektami typu TBitmap. Czy można połączyć te bitmapy w jedną i przekopiować do TImage? Próbowałem zrobić to tak:
Kod: Zaznacz cały
for ( itbitmap = bitmapvector.begin(); itbitmap <bitmapvector.end(); ++itbitmap )
      newimage->Canvas->CopyRect(Rect(0, 0, 950, 1280), (*itbitmap)->Canvas, Rect(0, 0, (*itbitmap)->Width, (*itbitmap)->Height));

ale do TImage kopiuje siÄ™ tylko ostatni element z vectora.
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
PodziÄ™kowaÅ‚ : 17
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    Windows XPFirefox

Re: TImage i bitmapy

Nowy postprzez Cyfrowy Baron » niedziela, 30 maja 2010, 08:06

Kopiuje się wszystko, ale funkcja CopyRect w Twoim kodzie, odrysowuje jedną grafikę na drugiej, więc nowa grafika wczytana do obszaru docelowego zasłania - wymazuje grafikę, która została tam wcześniej narysowana. Musisz sobie uzmysłowić, że ani klasa TCanvas, ani TBitmap i w zasadzie cała klasa TGraphics nie obsługują warstw, nie możesz więc umieścić jednej grafiki na drugiej, gdyż to jest tak jakbyś rysował na jednej kartce papieru i zawsze jak narysujesz na niej nowy obrazek to stary zniknie i nie możesz do niego powrócić nawet gdybyś użył gumki, gdyż gumka wymaże wszystko do białego papieru.
W tym konkretnym przypadku zamiast funkcji CopyRect lepiej jest użyć funkcji Draw.

Prosty przykład z umieszczaniem obok siebie trzech bitmap za pomocą funkcji Draw bez wektorów:
Kod: Zaznacz cały

 Graphics
::TBitmap *bitmapa = new Graphics::TBitmap;

 for(int i = 0; i < 3; i++)
 {
  String fileName = "c:\\image" + (String)(i + 1) + ".bmp";
  bitmapa->LoadFromFile(fileName);

  Image1->Canvas->Draw(i * bitmapa->Width, 0, bitmapa);
 }

 delete bitmapa;
 


Ten sam efekt można uzyskać za pomocą funkcji CopyRect, trzeba jednak prawidłowo ustawić współrzędne płótna docelowego:

Kod: Zaznacz cały

 Graphics
::TBitmap *bitmapa = new Graphics::TBitmap;

 for(int i = 0; i < 3; i++)
 {
  String fileName = "c:\\image" + (String)(i + 1) + ".bmp";
  bitmapa->LoadFromFile(fileName);

  Image1->Canvas->CopyRect(
  Rect(i * bitmapa->Width, 0, (i * bitmapa->Width) + bitmapa->Width, bitmapa->Height),
  bitmapa->Canvas,
  Rect(0, 0, bitmapa->Width, bitmapa->Height)
                          );
 }

 delete bitmapa;
 

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
duf
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: TImage i bitmapy

Nowy postprzez duf » poniedziaÅ‚ek, 31 maja 2010, 12:08

Dziękuję. Wstyd się przyznać ale takie łopatologiczne tłumaczenie najszybciej do mnie trafia ;-)
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
PodziÄ™kowaÅ‚ : 17
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows 10
Kompilator: XE8
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 20 gości

cron