Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Delphi - Ako tlačiť TImage?

Potrebujem obyčajnú tlač TImage. Nikde nemôžem nájsť metódu Print alebo niečo podobné. To ozaj nie je možnosť tlače obrázka? Mám teraz urobenú tlač formulára, ale na niektorých počítačoch sa vytlačí celý formulár a na iných len viditeľná časť. Na formulári je len TImage a teoreticky ak vytlačím ten, tak nemusím prerábať celú tlač v programe.

Ešte taký detail. Pri použití štandardných nastavení pred tlačou sa formulár so šírkou 800 pixelov vytlačil na šírku strany. Takéto isté nastavenie potrebujem aj pre ten obrázok.

Ešte ma tak napadlo, že by sa to dalo riešiť prenosom Canvas obrázku do Canvas TPrinter, ale to sa mi zdá prehnané. Ale ak ozaj nie je iná možnosť, tak aspoň keby mi niekto vysvetlil ako permanentne nastaviť DPI pre prípad, že obrázoík nebude taký veľký ako potrebujem.

Předmět Autor Datum
TImage preeses z Canvasu TImage na Canvas tiskarny. Treba pomoci Printer.BeginDoc; { tady pomoci fu…
Jan Fiala 14.09.2006 07:18
Jan Fiala
U velkých obrázků (>4MPix) toto selže, protože se zhroutí API funkce BitBlt a StretchBlt, které na t…
Rce 14.09.2006 09:59
Rce
Ja našťastie tlačím len obrázok s veľkosťou okolo 800x1024, ale dobre vedieť. Lenže ako nastaviť DPI…
msx. 14.09.2006 12:42
msx.
DPI nech na pokoji, změň jen velikost obrázku. V CopyRect nebo v té mojí proceduře určuješ velikost…
Rce 14.09.2006 12:58
Rce
Čiže ak tomu rozumiem správne, tak aký veľký priestor alokujem pre Canvas (Height a Width), tak sa t…
msx. 14.09.2006 23:40
msx.
Canvas tiskárny je daný. Je dle velikosti papíru do ní strčeného. Na něj obrázek prostě nakopíruješ.…
Rce 14.09.2006 23:56
Rce
Aha, tak potom by som sa mal opýtať, aké sú rozmery Canvas pri štandardnom A4? Edit: Áno, to som si…
msx. 15.09.2006 01:51
msx.
To lze těžko říci, záleží, v jakém DPI (právě) tiskne tiskárna :-). Většinou bývá 300DPI, takže rozm…
Rce 15.09.2006 02:05
Rce
Takže ďakujem za cenné informácie. Urobil som tlač a potreboval som približne 100 dpi (vypočítané z…
msx. 15.09.2006 17:48
msx.
Tak urobil som ako som napísal a pasuje to ako riťka na šerbel.;-) poslední
msx. 15.09.2006 21:29
msx.
Mas pravdu, z vestimi obrazky si StretchDraw neporadi a skoci na velikosti pameti. Pak se to da resi…
Jan Fiala 14.09.2006 14:32
Jan Fiala
Takže problém nie je v CopyRect, ale v zabratí pamäte, ktorej bude málo na danú operáciu?
msx. 15.09.2006 18:00
msx.
Podivej se do zdroju, jak je implementovana funkce CopyRect a StretchDraw. Obe pacuji nad bitmapami…
Jan Fiala 15.09.2006 18:30
Jan Fiala
Dost zajimavy poznatek s tiskem.:-)
virus 14.09.2006 14:18
virus
Ďakujem zúčastneným, funguje to presne ako bolo treba, vyriešené.
msx. 15.09.2006 17:59
msx.

U velkých obrázků (>4MPix) toto selže, protože se zhroutí API funkce BitBlt a StretchBlt, které na to Delphi použije. Pro větší obrázky je třeba nějaký takovýto postup - např. tisk fotky - předpokládám, že Bitmapu z TImage umíš vydojit ;-):

// Printer := objekt TPRinter z unity Printers
// PrintBMP := TBitmap k tisku
Printer.BeginDoc ();
// Tisk s přispůsobením na celou stránku - například fotka:
DrawBitMap (PrintBMP, Printer.Canvas, Rect (0, 0, Printer.PageWidth, Printer.PageHeight));
// Kdybys to nechtěl roztáhnout na celou stránku (tisk obrázku 1:1), použije se to třeba takto:
// DrawBitMap (PrintBMP, Printer.Canvas, Rect (0, 0, PrintBMP.Width, PrintBMP.Height));
Printer.EndDoc ();


//A ještě procedura DrawBitMap:

{---------------------- Nakreslení velkých bitmap na Canvas (třeba tiskárny) -------------------------------------}
{ 1. verze, dne  2.  7. 2003                                                                                      }
{                                                                                                                 }
procedure DrawBitMap (const ABitmap: TBitmap; const ACanvas: TCanvas; const ARect: TRect);
{	ABitmap	:= Bitmapa								}
{	ACanvas	:= Canvas, kam to chceme nakreslit					}
{	ARect	:= Rectangle v Canvasu, kam to nakreslit				}
var BitmapHeader: pBitmapInfo; BitmapImage: Pointer; HeaderSize, ImageSize: dword;    // DWORD je pro D3-D5 kompatibilitu
begin
	GetDIBSizes	(ABitmap.Handle, HeaderSize, ImageSize);
	GetMem		(BitmapHeader,  HeaderSize); GetMem (BitmapImage, ImageSize);
	try
		GetDIB (ABitmap.Handle, ABitmap.Palette, BitmapHeader^, BitmapImage^);
		StretchDIBits (ACanvas.Handle, ARect.Left, ARect.Top, ARect.Right - ARect.Left, ARect.Bottom - ARect.Top, 0, 0, ABitmap.Width, ABitmap.Height, BitmapImage, TBitmapInfo (BitmapHeader^), DIB_RGB_COLORS, SRCCOPY);
	finally 
		FreeMem (BitmapHeader); FreeMem (BitmapImage) 
	end
end;

Čiže ak tomu rozumiem správne, tak aký veľký priestor alokujem pre Canvas (Height a Width), tak sa to vždy zobrazí na celej strane? Teda ak alokujem 2100x2950 bodov, bude jedna strana, ak alukujem 1050x1475 a zakreslím len 500x500, tak to bude len v časti strany. Ak sa mýlim, tak ma oprav, prípadne pouč. Ešte k tomu alokovaniu. Ja som totiž TBitmap alokoval tak, že som mu určil Width a Height a bolo.

Canvas tiskárny je daný. Je dle velikosti papíru do ní strčeného. Na něj obrázek prostě nakopíruješ. Třeba s pomocí Canvas.CopyRect nebo Canvas.StretchDraw (nebo tou mojí rutinou). Kam (LEFT, TOP) to nakopíruješ, tam to na stránce bude a bude to veliké (Right - Left) x (Bottom - Top).
DPI fotky je obvykle 72 ať je 1MPix nebo 5MPix a změna DPI obvykle vede k těžké degradaci obrázku. Viz 040908dpi.html .

To lze těžko říci, záleží, v jakém DPI (právě) tiskne tiskárna :-). Většinou bývá 300DPI, takže rozměr A4 v palcích násob 300 :-). Nejlépe je velikost stránky zpracovávat programově. V mém výše uvedeném příkladu je vidět, že velikost stránky zjistíme "Delfáckým" způsobem z Printer.PageWidth a Printer.PageHeight - bacha, je to velikost stránky od kraje do kraje (tedy včetně technicky netištitelné oblasti). "Windowsáckým" způsobem - API funkcí Windows GetDeviceCaps (Printer.Handle, co-chceme) lze o nastavení tiskárny zjistít téměř všechno (velikost netištitelných okrajů je GetDeviceCaps (Printer.Handle, PHYSICALOFFSETX) a GetDeviceCaps (Printer.Handle, PHYSICALOFFSETY)).

Takže ďakujem za cenné informácie. Urobil som tlač a potreboval som približne 100 dpi (vypočítané z hlavy). No a keď som to vytlačil, tak som to musel zväčšiť 6x, takže mi asi tlačí 600 dpi.:?: Dobre, že píšeš o rozmeroch stránky, dám prepočítať koeficienty pred tlačou a bude to v poriadku (dúfam).

Zpět do poradny Odpovědět na původní otázku Nahoru