Drukowanie TImage

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Drukowanie TImage

Nowy postprzez duf » poniedziaÅ‚ek, 15 marca 2010, 12:05

Jak wydrukować zawartość Image1->Picture? Czy można przekształcić ją w wartość bmp tak , żeby wysłać do funkcji:
Kod: Zaznacz cały
void __fastcall  Drukuj(Graphics::TBitmap *Bmp)
{
Printer()->Orientation = poLandscape;  // ustawienie drukowania w poziomie.

Printer()->BeginDoc();

int x = Printer()->PageWidth;  // dÅ‚ugość strony.
int y = Printer()->PageHeight; // wysokość strony.
                          //left, top, right, bottom
Printer()->Canvas->CopyRect(Rect(0, 0, x, y), Bmp->Canvas, Rect(0, 0, Bmp->Width, Bmp->Height));

Printer()->EndDoc();
}
//--------------------------------

A w ogóle to szukam sposobu na drukowanie własnej tabeli, która widoczna byłaby na formie już z wypełnionymi polami. A jak wydrukować TShape położone na TForm?
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 TImage

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 15 marca 2010, 13:54

Drukuje się zawartość Canvas, klasa Printer obsługuje klasę TCanvas, więc cokolwiek chcesz wydrukować musisz to odrysować na płótnie Canvas. Dotyczy to zawartości TImage jak i TShape. Cokolwiek chcesz drukować rysujesz na TCanvas klasy Printer.

Możesz drukować zawartość TImage o ile zawiera ono obiekt w formacie BMP, jeżeli zawiera grafikę w innym formacie, to musisz najpierw dokonać konwersji na Bitmapę a potem to wydrukować.

Przykład 1: drukowania zawartości obiektu Image zawierającego bitmapę:

Kod: Zaznacz cały
#include <Printers.hpp>

Graphics::TBitmap *Bmp = Image1->Picture->Bitmap;

Printer()->Orientation = poLandscape;

Printer()->BeginDoc();

int x = Printer()->PageWidth; // długość strony.
int y = Printer()->PageHeight; // wysokość strony.

int width;
int height;

if((x / Bmp->Width) < (y / Bmp->Height))
{
  width = Bmp->Width * ((x / Bmp->Width) + 0.5);
  height = Bmp->Height * ((x / Bmp->Width) + 0.5);
}
else
{
  height = Bmp->Height * ((y / Bmp->Height) + 0.5);
  width = Bmp->Width * ((y / Bmp->Height) + 0.5);
}

Printer()->Canvas->CopyRect(Rect(10, 10, width, height), Bmp->Canvas, Rect(0, 0, Bmp->Width, Bmp->Height));

Printer()->EndDoc();


Przykład 2: drukowania zawartości obiektu Image zawierającego grafikę w formacie JPEG:

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


Bmp->Width  = Image1->Picture->Graphic->Width;
Bmp->Height = Image1->Picture->Graphic->Height;

Bmp->Canvas->Draw( 0, 0, Image1->Picture->Graphic);

Printer()->Orientation = poLandscape;

Printer()->BeginDoc();

int x = Printer()->PageWidth; // długość strony.
int y = Printer()->PageHeight; // wysokość strony.

int width;
int height;

if((x / Bmp->Width) < (y / Bmp->Height))
{
  width = Bmp->Width * ((x / Bmp->Width) + 0.5);
  height = Bmp->Height * ((x / Bmp->Width) + 0.5);
}
else
{
  height = Bmp->Height * ((y / Bmp->Height) + 0.5);
  width = Bmp->Width * ((y / Bmp->Height) + 0.5);
}

Printer()->Canvas->CopyRect(Rect(10, 10, width, height), Bmp->Canvas, Rect(0, 0, Bmp->Width, Bmp->Height));

Printer()->EndDoc();


Przykład 2 może być wykorzystany do drukowania dowolnej zawartości TImage, czyli zarówno JPEG, PNG, GIF, (nowsze wersje środowiska) jak też do bitmap, więc jest bardziej uniwersalny.

Musisz jednak pamiętać o jednym nie drukujesz w ten sposób obiektu Image lecz zawartości obiektu Image, a różnica jest istotna, gdyż to co wczytasz do Image może być w nim różnie wizualizowane, czyli może być zniekształcone, obcięte itp., ale to bez znaczenia, gdyż podany wyżej kod drukuje to co zostało do niego wczytanie a nie to co jest wyświetlane.

By drukować obiekt Image trzeba by się oprzeć na jego klasie TCanvas (Image->Canvas), a nie Graphics, ale klasa TCanvas obsługuje tylko grafikę w formacie BMP, więc w przypadku grafiki innej niż bitmapa, należałoby przed pobraniem zawartości Canvas przekształcić tą grafikę na bitmapę.

Przykład 3: drukowanie obiektu Image - nie zawartości obiektu Image, lecz obiektu Image zawierającego bitmapę:

Kod: Zaznacz cały

Printer()->Orientation = poLandscape;

Printer()->BeginDoc();

int x = Printer()->PageWidth; // długość strony.
int y = Printer()->PageHeight; // wysokość strony.

int width;
int height;

if((x / Image1->Width) < (y / Image1->Height))
{
  width = Image1->Width * ((x / Image1->Width) + 0.5);
  height = Image1->Height * ((x / Image1->Width) + 0.5);
}
else
{
  height = Image1->Height * ((y / Image1->Height) + 0.5);
  width = Image1->Width * ((y / Image1->Height) + 0.5);
}

Printer()->Canvas->CopyRect(Rect(10, 10, width, height), Image1->Canvas, Rect(0, 0, Image1->Width, Image1->Height));

Printer()->EndDoc();
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