Drukowanie bitmapy

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Drukowanie bitmapy

Nowy postprzez duf » czwartek, 3 czerwca 2010, 21:25

Jak wydrukować za jednym razem całą bitmapę? Mam wektor z bitmapami, chcę je połączyć w jedną bitmapę i wydrukować. Próbowałem to zrobić tak:
Kod: Zaznacz cały
vector<Graphics::TBitmap*>::iterator itbitmap;
vector<Graphics::TBitmap*> bitmapvector;
........................................// załadowanie wektorów

Graphics::TBitmap* bmp = new Graphics::TBitmap;
for ( itbitmap = bitmapvector.begin(); itbitmap < bitmapvector.end(); ++itbitmap, ++i )
{
   bmp->Canvas->Draw( 0, i*1340, (*itbitmap) );
}

Printer()->BeginDoc();                        
Printer()->Canvas->CopyRect(Rect(0, 0, Printer()->PageWidth, Printer()->PageHeight), bmp->Canvas, Rect(0, 0, bmp->Width, 1300));
Printer()->EndDoc();

Nie wiem czy problem leży w łączeniu bitmap w jedną, czy też w drukowaniu.
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: Drukowanie bitmapy

Nowy postprzez Cyfrowy Baron » czwartek, 3 czerwca 2010, 22:26

► patrz serwis: Cyfrowy Baron dział: porady -> drukowanie -> Drukowanie grafiki.



Kod: Zaznacz cały
Printer()->Canvas->CopyRect(Rect(0, 0, Printer()->PageWidth, Printer()->PageHeight), bmp->Canvas, Rect(0, 0, bmp->Width, 1300));


CopyRect( obszar docelowy, źródłowe płótno Canvas, rozmiar kopiowanego obszaru).

Jeżeli ma być wydrukowana cała bitmapa, to rozmiar kopiowanego obszaru musi być równy rozmiarowi bitmapy.

Kod: Zaznacz cały
Printer()->Canvas->CopyRect(Rect(0, 0, Printer()->PageWidth, Printer()->PageHeight), bmp->Canvas, Rect(0, 0, bmp->Width, bmp->Height));


Poza tym przed narysowaniem czegokolwiek na płótnie Canvas obiektu typu TBitmap musisz najpierw określić rozmiar bitmapy, czyli:

Kod: Zaznacz cały
Graphics::TBitmap* bmp = new Graphics::TBitmap;

bmp->Width = maksymalna szerokość bitmapy;
bmp->Height = maksymalna wysokość bitmapy;

for ( itbitmap = bitmapvector.begin(); itbitmap < bitmapvector.end(); ++itbitmap, ++i )
{
   bmp->Canvas->Draw( 0, i*1340, (*itbitmap) );
}

Płótno typu TCanvas nie posiada wymiarów, ale obiekt który wykorzystuje to płótno musi takie rozmiary posiadać, w przypadku gdy nie określisz rozmiaru bitmapy na która kopiujesz inne bitmapy to ma ona wymiar zerowy, mimo iż jej płótno Canvas zawiera rysunek o określonych wymiarach. Obiekt typu TBitmap dostosowuje swój rozmiar do grafiki wczytanej z pliku, ale nie dostosowuje swojego rozmiaru do rozmiaru płótna Canvas, gdyż to płótno ma wymiary nieokreślone.
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: Drukowanie bitmapy

Nowy postprzez polymorphism » piątek, 4 czerwca 2010, 09:39

Może inaczej, Canvas (a dokładniej kontekst urządzenia) to zestaw narzędzi do rysowania, jakie dane urządzenie udostępnia.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Drukowanie bitmapy

Nowy postprzez duf » wtorek, 8 czerwca 2010, 09:58

Coś jest nie tak i nie wiem co.
Kod: Zaznacz cały
for ( itbitmap = bitmapvector.begin(); itbitmap < bitmapvector.end(); ++itbitmap, ++i )
{
   //bmp->Canvas->Draw( 0, i*1359, (*itbitmap) );
   newimage->Canvas->Draw( 0, i*1359, (*itbitmap) );
}

Chcę sprawdzić dlaczego nie mogę wydrukować wszystkich elementów vectora i użyłem TImage do podglądu.
Kod: Zaznacz cały
newimage->Parent = newform;
newimage->Width = 950;
newimage->Height = 1359*3;
newform->ShowModal();

I wszystko widać tak jak sobie to założyłem. Czyli widzę trzy elementy następujące jeden za drugim. Ale nie mogę wydrukować tego widoku. Oczywiście mógłbym wydrukować to z TImage ale uparłem się nie wprowadzać dodatkowego obiektu skoro mam bitmape.
Kod: Zaznacz cały
Printer()->BeginDoc();
Printer()->Canvas->CopyRect(Rect(0, 0, Printer()->PageWidth, Printer()->PageHeight), bmp->Canvas, Rect(0, 0, bmp->Width, bmp->Height));
Printer()->EndDoc();

Drukuje tylko jeden element z vectora. Jak wydrukować wszystkie elementy?
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: Drukowanie bitmapy

Nowy postprzez Cyfrowy Baron » wtorek, 8 czerwca 2010, 11:31

Czy zastosowałeś się do tej wskazówki?

Cyfrowy Baron napisał(a):
Kod: Zaznacz cały
Graphics::TBitmapbmp = new Graphics::TBitmap;

    
bmp->Width maksymalna szerokość bitmapy;
    
bmp->Height maksymalna wysokość bitmapy;

    for ( 
itbitmap bitmapvector.begin(); itbitmap bitmapvector.end(); ++itbitmap, ++)
    {
       
bmp->Canvas->Draw0i*1340, (*itbitmap) );
    }
 

Płótno typu TCanvas nie posiada wymiarów, ale obiekt który wykorzystuje to płótno musi takie rozmiary posiadać, w przypadku gdy nie określisz rozmiaru bitmapy na która kopiujesz inne bitmapy to ma ona wymiar zerowy, mimo iż jej płótno Canvas zawiera rysunek o określonych wymiarach. Obiekt typu TBitmap dostosowuje swój rozmiar do grafiki wczytanej z pliku, ale nie dostosowuje swojego rozmiaru do rozmiaru płótna Canvas, gdyż to płótno ma wymiary nieokreślone.
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: Drukowanie bitmapy

Nowy postprzez duf » wtorek, 8 czerwca 2010, 11:58

Myślę, że tak.
Kod: Zaznacz cały
bitmapvector.push_back( new Graphics::TBitmap );
itbitmap = bitmapvector.end()-1;
(*itbitmap)->Width = 960;
(*itbitmap)->Height = 1359;

(*itbitmap)->LoadFromFile( (sciezka + L"pict.bmp").c_str() );
(*itbitmap)->Canvas->TextOut( 10,10,"TEXT" )

Graphics::TBitmap* bmp = new Graphics::TBitmap;
bmp->Width = 960;
bmp->Height = 1359*3; // określam rozmiar
bmp->Assign((*itbitmap));

bitmapvector.push_back( new Graphics::TBitmap );
itbitmap = bitmapvector.end()-1;
(*itbitmap)->Width = 960;
(*itbitmap)->Height = 1359;
bitmapvector.push_back( new Graphics::TBitmap );
itbitmap = bitmapvector.end()-1;
(*itbitmap)->Width = 960;
(*itbitmap)->Height = 1359;

(*itbitmap)->Assign(bmp);
(*itbitmap)->Canvas->TextOut( 70, 480, "6" );

itbitmap = bitmapvector.end()-2;
(*itbitmap)->Assign(bmp);
(*itbitmap)->Canvas->TextOut( 70, 480, "7" );

itbitmap = bitmapvector.begin();
(*itbitmap)->Assign(bmp);
(*itbitmap)->Canvas->TextOut( 70, 480, "8" );

for ( itbitmap = bitmapvector.begin(); itbitmap < bitmapvector.end(); ++itbitmap, ++i )
{
   bmp->Canvas->Draw( 0, i*1359, (*itbitmap) );
   newimage->Canvas->Draw( 0, i*1359, (*itbitmap) );
}

I tak jak już pisałem w Imagu widzę trzy elementy a wydruk jest tylko jeden, element z numerem 8.
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: Drukowanie bitmapy

Nowy postprzez Cyfrowy Baron » wtorek, 8 czerwca 2010, 13:26

Bo masz coś pomieszane z tymi wektorami. Wygląda mi na to, że cały czas odwołujesz się do jednej bitmapy przechowywanej w wektorze i stąd ten problem.
Sam sposób poruszania się po tablicy wektorowej jest dla mnie trochę niezrozumiały:

Kod: Zaznacz cały
for ( itbitmap = bitmapvector.begin(); itbitmap < bitmapvector.end(); ++itbitmap, ++i )


Nie wiem czym jest i gdyż nigdzie nie widzę definicji tej zmiennej. Nie wygląda mi to i jednak na iterator, a wydaje mi się, że właśnie tak chcesz się po tej tablicy poruszać.

Może zrezygnuj z wektorów i posłuż się raczej tablicą asocjacyjną.
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: Drukowanie bitmapy

Nowy postprzez polymorphism » wtorek, 8 czerwca 2010, 13:29

A co mu z tej tablicy asocjacyjnej w tym przypadku?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Drukowanie bitmapy

Nowy postprzez Cyfrowy Baron » wtorek, 8 czerwca 2010, 13:29

A co mu po wektorach, skoro zawierają tylko trzy określone z góry elementy, to można po prostu zdefiniować tablicę typy TBitmap.

Poza tym mam wrażenie, że te bitmapy są na bieżąco wczytywane z pliku, więc nie ma sensu przechowywać je w pamięci, skoro można je pobrać z dysku przed każdym kopiowaniem do bitmapy zbiorczej.

Wskaż błąd w jego kodzie!
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: Drukowanie bitmapy

Nowy postprzez duf » wtorek, 8 czerwca 2010, 13:37

Cyfrowy Baron napisał(a):Bo masz coś pomieszane z tymi wektorami. Wygląda mi na to, że cały czas odwołujesz się do jednej bitmapy przechowywanej w wektorze i stąd ten problem.
Sam sposób poruszania się po tablicy wektorowej jest dla mnie trochę niezrozumiały:

Kod: Zaznacz cały
for ( itbitmap = bitmapvector.begin(); itbitmap < bitmapvector.end(); ++itbitmap, ++i )


Nie wiem czym jest i gdyż nigdzie nie widzę definicji tej zmiennej. Nie wygląda mi to i jednak na iterator, a wydaje mi się, że właśnie tak chcesz się po tej tablicy poruszać.

Kod: Zaznacz cały
i = 0;
for( itbitmap = bitmapvector.begin(); itbitmap < bitmapvector.end(); ++itbitmap, ++i )
bmp->Canvas->Draw( 0, i * 1359, (*itbitmap) ); // tu jest to "i"
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: Drukowanie bitmapy

Nowy postprzez duf » wtorek, 8 czerwca 2010, 13:39

Cyfrowy Baron napisał(a):A co mu po wektorach, skoro zawierają tylko trzy określone z góry elementy, to można po prostu zdefiniować tablicę typy TBitmap.

To jest tylko przykład. Elementy są zmienne.
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: Drukowanie bitmapy

Nowy postprzez Cyfrowy Baron » wtorek, 8 czerwca 2010, 13:40

Tak po trochu...

duf napisał(a):
Kod: Zaznacz cały
bitmapvector.push_back( new Graphics::TBitmap );
itbitmap = bitmapvector.end()-1;
(*itbitmap)->Width = 960;
(*itbitmap)->Height = 1359;

(*itbitmap)->LoadFromFile( (sciezka + L"pict.bmp").c_str() );


Skoro wczytujesz bitmapę w z pliku to nie ma sensu definiowania rozmiaru przed pobraniem, gdyż po wczytaniu pliku rozmiar obiektu typu TBitmap zostanie ustawiony na rozmiar wczytanej bitmapy. Wystarczy więc tak:

Kod: Zaznacz cały
bitmapvector.push_back( new Graphics::TBitmap );
itbitmap = bitmapvector.end()-1;
(*itbitmap)->LoadFromFile( (sciezka + L"pict.bmp").c_str() );
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: Drukowanie bitmapy

Nowy postprzez Cyfrowy Baron » wtorek, 8 czerwca 2010, 13:42

To jest tylko przykład. Elementy są zmienne.


Tylko że trzy bitmapy każda o wymiarach 960 x 1359 będą zajmowały około 11 MB pamięci. Przechowywanie większej liczby takich bitmap jest wysoce nieekonomiczne.



A co to jest:

LoadFromFile( (sciezka + L"pict.bmp").c_str() )

Funkcja oczekuje wartości typu UnicodeString, a Ty konwertujesz to na typ char? Gdzie tu logika? Jeżeli zmienna sciezka jest typu String to wystarczy tak:

LoadFromFile( sciezka + "pict.bmp" )
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: Drukowanie bitmapy

Nowy postprzez duf » wtorek, 8 czerwca 2010, 13:46

Cyfrowy Baron napisał(a):A co to jest:
LoadFromFile( (sciezka + L"pict.bmp").c_str() )

Funkcja oczekuje wartości typu UnicodeString, a Ty konwertujesz to na typ char? Gdzie tu logika?

Tu akurat sciezka jest typu wstring
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: Drukowanie bitmapy

Nowy postprzez polymorphism » wtorek, 8 czerwca 2010, 13:57

A co mu po wektorach, skoro zawierają tylko trzy określone z góry elementy (...)

Nie wiem, ale vector jest tu bardziej na miejscu niż tablica asocjacyjna (asocjacja czego z czym?). Być może autor zakłada, że tych bitmap będzie więcej, a ich ilość będzie się zmieniać w zależności od czegoś tam.

Wskaż błąd w jego kodzie!

Mówisz, masz:
Kod: Zaznacz cały
bitmapvector.push_back( new Graphics::TBitmap );
itbitmap = bitmapvector.end()-1;
(...)
Graphics::TBitmap* bmp = new Graphics::TBitmap;
(...)
bmp->Assign((*itbitmap)); //<--- !!!
 

Jeśli dobrze rozumiem (a raczej pamiętam) działanie metody Assign, to nie służy ona do kopiowania bitmap (w sensie operacji rastrowych), ale do tworzenia duplikatu obiektu podanego w parametrze. Zatem bmp będzie miała rozmiar i inne parametry takie, jak bitmapa z itbitmap. Stąd oczywisty wniosek, że w bmp zmieści się tylko jedna bitmapa, pozostałe będą rysowane poza obszarem.

Oczywiście mogłem się gdzieś w tych swoich, co tu dużo mówić, luźnych analizach pomylić ;)
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Następna strona

  • 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

cron