![]() |
Bild drucken
Moin!
Ich habe schon die DP, das SDC und Google durchsucht, bin aber auf kein brauchbares Ergebnis gekommen. Ich möchte ein Bild ausdrucken und dabei den Abstand zu den Seitnrändern und die Maße des Bildes in Millimeter angeben können. Wie man auf Millimeter umstellt, habe ich gefunden:
Delphi-Quellcode:
und die Breite der Seite, die für den Drucker eingestellt ist, ebenfalls:
SetMapMode(printer.Canvas.Handle, MM_LOMETRIC);
Delphi-Quellcode:
Klar, Millimeter ginge hier auch.
// Seitengröße in 1/10 mm ermitteln
PageWidth := GetDeviceCaps(Printer.Canvas.Handle, HORZSIZE) * 10; PageHeight := GetDeviceCaps(Printer.Canvas.Handle, VERTSIZE) * 10; Nun zum eigentlichen Problem: Wie kann ich dem Drucker mitteilen, dass er ein Bild z.B. 15 mm vom oberen Rand und 25 mm vom linken Rand drucken soll, wobei das Bild bei der Ausgabe eine größe von 100 * 200 mm haben sollte? Mit ![]()
Delphi-Quellcode:
StretchBlt(Image2.Canvas.Handle, 0, 0, 100, 100, Image1.Canvas.Handle, 0, 0, 200, 200, SRCCOPY);
|
Re: Bild drucken
Ich habe SetMapMode zwar noch nie eingesetzt, aber werden die Pixelangaben von StretchBlt dann nicht automatisch auf LOMETRIC umgerechnet :gruebel: ?
|
Re: Bild drucken
Dazu müsste aber die DPI-Auflösung des Druckers ermittelt werden, oder was meinst du?
|
Re: Bild drucken
Nein, das macht Windows schon automatisch. TRect und TPoint haben ja eigentlich keine Einheit, durch SetMapMode wird das Koordinatensystem der Canvas auf die neue Einheit umgestellt.
Delphi-Quellcode:
Ein 100x100 Pixel großer Ausschnitt des Images wird auf einen 1x1 cm großen Teil des zu druckenden Blattes kopiert.
SetMapMode(printer.Canvas.Handle, MM_LOMETRIC);
StretchBlt(Printer.Canvas.Handle, 0, 0, 100, 100, Image1.Canvas.Handle, 0, 0, 100, 100, SRCCOPY); |
Re: Bild drucken
Sicher, dass es 1 x 1 cm sind?
Logischer wäre in dem Falle 10 x 10 cm :gruebel: Ich werde es gegen später ausprobieren, danke. |
Re: Bild drucken
Ich wollte mich schon entschuldigen, stimmt aber doch :mrgreen: . MM_LOMETRIC hat die Maßeinheit 1/10 mm, also 100 Pixel => 1 cm.
|
Re: Bild drucken
Aber "MM", naja, das ist ja dann das kleinste Problem.
Wie drucke ich denn da genau ein Bild? Muss ich es mittels
Delphi-Quellcode:
erst darauf zeichnen?
Image1.Canvas.Draw(bmp, 0, 0)
Ich habe das Bild in einem Bitmap und möchte das eben in angegebenen Abmessungen ausdrucken. :gruebel: |
Re: Bild drucken
Falls es dir noch hilft: Hier hab ich mal alle Ränder eines bestimmten Druckers herausfinden wollen. Das Ergebnis der Funktionen ist in Millimetern. Aber zum Drucken brauchst du die Ränder links und oben nicht zu berücksichtigen, da der Canvas des Druckers bei 0,0 auf dem Papier schon sichtbar ist.
Delphi-Quellcode:
function TPrinterSettings.DrRand1mm: integer;
var dpi: integer; begin //linker Rand dpi := GetDeviceCaps(Printer.Handle, LOGPIXELSX); if dpi <> 0 then result:=round((GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX)/dpi)*25.4) ELSE result := 0; end; function TPrinterSettings.DrRand2mm: integer; var dpi: integer; begin //oberer Rand dpi := GetDeviceCaps(Printer.Handle, LOGPIXELSY); if dpi <> 0 then result:=round((GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY)/dpi)*25.4) ELSE result := 0; end; function TPrinterSettings.DrRand3mm: integer; var dpi: integer; begin //rechter Rand dpi := GetDeviceCaps(Printer.Handle, LOGPIXELSX); if dpi <> 0 then result:=round((GetDeviceCaps(Printer.Handle, PHYSICALWIDTH)- GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX)- GetDeviceCaps(Printer.Handle, HORZRES))/dpi*25.4) ELSE result := 0; end; function TPrinterSettings.DrRand4mm: integer; var dpi: integer; begin //rechter Rand dpi := GetDeviceCaps(Printer.Handle, LOGPIXELSY); if dpi <> 0 then result:=round((GetDeviceCaps(Printer.Handle, PHYSICALHEIGHT)- GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY)- GetDeviceCaps(Printer.Handle, VERTRES))/dpi*25.4) ELSE result := 0; end; |
Re: Bild drucken
Danke, kann mir sonst noch jemand helfen? ;)
|
Re: Bild drucken
du hast es doch schon fast da stehen
Delphi-Quellcode:
nur das du dort 0, 0 als obere linke ecke angegeben hat. Um diese zu ändern musst du es nur noch wie folgt abändern:
StretchBlt(Printer.Canvas.Handle, 0, 0, 100, 100, Image1.Canvas.Handle, 0, 0, 100, 100, SRCCOPY);
Delphi-Quellcode:
Wenn du dies jetzt so ausprobierst müsstest du allerdings feststellen das dein bild nicht gedruckt wird. Grund ist das der Y-Wert von oben nach unten kleiner wird. Die Blatt oberkannte ist also 0 und der untere Bildrand ist dann -Blatthöhe. Durch diese Verdrehung wird dein Bild auch auf dem Kopfstehend ausgedruckt falls du das bild wie folgt druckst.
StretchBlt(Printer.Canvas.Handle, AbstandVonLinks, AbstandVonOben, 100, 100, Image1.Canvas.Handle, 0, 0, 100, 100, SRCCOPY);
Delphi-Quellcode:
Du musst also vorher das bild auch noch spiegeln. Desweiteren musst du hoffen das dein drucker dann auch wirklich das bild druckt, denn nicht jeder drucker druckt bilder aus die auf diese art und weise auf die Canvas des Druckers gebracht werden.
StretchBlt(Printer.Canvas.Handle, AbstandVonLinks, -(AbstandVonOben + Image1BildhöheIn10mm), 100, 100, Image1.Canvas.Handle, 0, 0, 100, 100, SRCCOPY);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz