Registriert seit: 29. Jan 2007
Ort: daheim
471 Beiträge
Delphi 10.2 Tokyo Enterprise
|
Re: Maßeinheitengenau ein Canvas ausdrucken
28. Mär 2007, 08:58
Nimm zum Drucken eines Bildes am besten folgenden Code
Delphi-Quellcode:
PROCEDURE PrintBitmap(Canvas: TCanvas; DestRect: TRect; Bitmap: TBitmap);
// PROC eingeführt am 10.1.07 da bessere ausgabeergebnisse
VAR
BitmapHeader: pBitmapInfo;
BitmapImage,header,bits : POINTER;
HeaderSize, BitsSize: Cardinal;
//HeaderSize : DWORD; // Use DWORD for D3-D5 compatibility
ImageSize : DWORD;
nographics:boolean;
BEGIN
// TEST
//if GetDeviceCaps(Printer.Handle, RASTERCAPS) then NoGraphics := True;
GetDIBSizes(Bitmap.Handle, HeaderSize, ImageSize);
//GetMem(BitmapHeader, HeaderSize);
//GetMem(BitmapImage, ImageSize);
Bitmapheader := VirtualAlloc(nil, HeaderSize, MEM_COMMIT, PAGE_READWRITE);
BitmapImage := VirtualAlloc(nil, ImageSize, MEM_COMMIT, PAGE_READWRITE);
TRY
GetDIB(Bitmap.Handle, Bitmap.Palette, BitmapHeader^, BitmapImage^);
StretchDIBits(Canvas.Handle,
DestRect.Left, DestRect.Top, // Destination Origin
DestRect.Right - DestRect.Left, // Destination Width
DestRect.Bottom - DestRect.Top, // Destination Height
0, 0, // Source Origin
Bitmap.Width, Bitmap.Height, // Source Width & Height
BitmapImage,
TBitmapInfo(BitmapHeader^),
DIB_RGB_COLORS,
SRCCOPY)
FINALLY
//FreeMem(BitmapHeader);
//FreeMem(BitmapImage)
VirtualFree(Bitmapheader, 0, MEM_FREE);
VirtualFree(bitmapimage, 0, MEM_FREE);
END
END {PrintBitmap};
hab hier mal vor einiger Zeit Getmem durch getdibsizes ersetzt, da ich bei getmem zum teil falsche Wérte bekommen habe. Sollte so funktionieren. Den Grundcode hab ich irgendwo gegoogelt.
um dann das ganze auf eine bestimmte Größe anpassen zu können nutzt du das:
Delphi-Quellcode:
printer.title:=Dein Programmname '+filetext;
if printer.printing then printer.abort;
printer.begindoc;
//Drucker-Daten ermitteln: (Hoehe und Breite in cm und Pixeln)
//durch 10, da mm in cm umrechnen
BreiteCm :=GetDeviceCaps(Printer.Handle,HORZSIZE) div 10;
BreitePixel :=GetDeviceCaps(Printer.Handle,HORZRES);
HoeheCm :=GetDeviceCaps(Printer.Handle,VERTSIZE) div 10;
HoehePixel :=GetDeviceCaps(Printer.Handle,VERTRES);
//wieviel Pixel auf 1 cm kommen:
HorizPixelProCm :=BreitePixel div BreiteCm;
VertPixelProCm :=HoehePixel div HoeheCm;
breitereal:=BreitePixel/BreiteCm;
hoehereal:=(HoehePixel/HoeheCm);
horp:= HorizPixelProCm;
verp:= VertPixelProCm;
faktor:=10;
LRand := HorizPixelProCm;
ORand :=VertPixelProCm;
...
...
Printbitmap(...)
printer.enddoc;
gruß Matthias
Matthias Das Leben ist eines der härtesten.
|