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.
TImage preeses z Canvasu TImage na Canvas tiskarny.
Treba pomoci
Dalsi moznosti je pouzit nejaky navrhar sestav (QuickReport).
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 :
Ja našťastie tlačím len obrázok s veľkosťou okolo 800x1024, ale dobre vedieť. Lenže ako nastaviť DPI, ak to náhodou nebude na šírku stránky?
DPI nech na pokoji, změň jen velikost obrázku. V CopyRect nebo v té mojí proceduře určuješ velikost cílového obrázku záznamem typu TRcet.
Č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 .
Aha, tak potom by som sa mal opýtať, aké sú rozmery Canvas pri štandardnom A4?
Edit: Áno, to som si už dávno všimol, že CopyRect dokáže zázraky (zväčšovanie, zmenšovanie).
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).
Tak urobil som ako som napísal a pasuje to ako riťka na šerbel.
Mas pravdu, z vestimi obrazky si StretchDraw neporadi a skoci na velikosti pameti. Pak se to da resit rozdelenim prenosu obrazku na cavas napr. na 4x
Takže problém nie je v CopyRect, ale v zabratí pamäte, ktorej bude málo na danú operáciu?
Podivej se do zdroju, jak je implementovana funkce CopyRect a StretchDraw. Obe pacuji nad bitmapami a pri velkem obazku a velke barevne hloubce to nezvladnou
Dost zajimavy poznatek s tiskem.
Ďakujem zúčastneným, funguje to presne ako bolo treba, vyriešené.