![]() |
Druck-Komponente für Bitmaps
Hi!
Kennt jemand eine Komponente (oder alternativ eine elegante und unkomplizierte Methode mit TPrinter), mit der man Bitmaps ohne viel Trara auf eine (Papier-)Seite drucken kann? Beispielsweise sollte es möglich sein, die/das Bitmap auf Seitengröße zu stretchen, alternativ auch ohne Verlust des originalen Seitenverhältnisses. Die vom Drucker abhängigen Seitenränder sollten beachtet werden. Ich hatte mal angefangen eine kleine Druck-Komponente zu schreiben, aber es scheiterte kläglich wegen der Umrechnung zwischen den verschiedenen Einheiten und all den Canvas-Modi. Mal sind es Pixel, dann Zehntelmillimeter, dann wieder "Device Units". Mal zeigen positive Y-Werte nach oben, dann wieder nach unten. Das macht mich echt fertig... Ich hätte mir nie träumen lassen, dass es so schwer sein würde, irgendetwas auszudrucken :tongue: Grüße, Dani |
Re: Druck-Komponente für Bitmaps
Schau dir mal mein kleines Beispiel zur
![]() Damit errechnest du dir die Dimensionen des Rechtecks, in dem dein Bild auf dem Blatt Papier gedruckt werden sollen, damit es in maximaler Größe auf dem Blatt ausgedruckt werden kann. Es sollte dann kein Problem mehr sein, dieses Rechtek so auf dem Blatt zu positionieren, daß du deine Bitmap ausdrucken kannst. Ein Tip am Rande: Ich verwende seit Jahren eine Wrapper-Komponente namens XPrint, die in der Zeitschrift Toolbox seit Jahren weiterentwickelt wird und die das Printer-Objekt kapselt. Nachteil dieser Komponente ist allerdings, daß sie nicht Freeware ist, sondern daß man sich die entsprechende Zeitschrift gekauft haben muß, in der sie (weiter-)entwickelt wurde. Einfach mal hier nachschauen: ![]() [edit]Ansonsten mal bei ![]() Grüße Mikhal |
Re: Druck-Komponente für Bitmaps
Danke!Die Prozedur zur Druckskalierung schaut sehr gut aus! Ein paar kleine Fragen hätte ich noch: Kann man für die Werte iBlattBreite und iBlattHoehe Printer.PageWidth und Printer.PageHeight verwenden? Entspricht (0|0) hier dem ersten Punkt auf der bedruckbaren Fläche? Falls nicht, wie komme ich an die Druckrandbreite in Pixel?
|
Re: Druck-Komponente für Bitmaps
Zitat:
[edit]Du solltest aber vorher den nichtbedruckbaren Rand von der Breite bzw. Höhe abziehen.[/edit] Zitat:
Grüße Mikhal |
Re: Druck-Komponente für Bitmaps
Merci!
Zitat:
PS: Wenn ich DruckSkalierung verwende wie in diesem Codebeispiel, wirft der Drucker nur eine leere Seite aus... ich seh den Fehler nicht. :gruebel:
Delphi-Quellcode:
DrawRect sieht nach dem Aufruf von DruckSkalierung so aus:
procedure TPrintMGR.PrintBitmap(aBitmap: TBitmap);
var i: Integer; DrawRect: TRect; begin {... Drucker auswählen usw.} BeginDoc; DruckSkalierung(DrawRect, Printer.PageWidth, Printer.PageHeight, aBitmap.Width, aBitmap.Height, GetXDPI / 72, GetYDPI / 72); DrawBitmap(Canvas, DrawRect, aBitmap); // Wie StretchDraw, verträgt sich aber besser mit Druckern EndDoc; {...} end;
Code:
Dagegen klappt es mit
Left: 4354646
Top: 1245114 Right: 4354645 Bottom: 1245113
Delphi-Quellcode:
bis auf die unberücksichtigten nicht bedruckbaren Bereiche ganz gut.
DrawRect := RECT(0, 0, Printer.PageWidth, Printer.PageHeight);
Gruß, Dani |
Re: Druck-Komponente für Bitmaps
Selbst errechnen: in den Unterlagen zu deinem Drucker checken, wie breit die einzelnen Ränder sind. Anschließend mit der Auflösung des Druckers muliplizieren. Ansonsten ausprobieren.
Genau dieses Problem läßt mich ja die oben genannte Komponente favorisieren, weil sie bereits in Pixel umgerechnete Werte für die Ränder zur Verfügung stellt. Letztlich wird es wohl auch eine API-Funktion bei Windows geben, die habe ich aber jetzt nicht parat, weil ich mich nicht mehr darum bemühen muß. Grüße Mikhal |
Re: Druck-Komponente für Bitmaps
Ich kenne die Konstanten GetXDPI bzw GetYDPI nicht, oder sind das Funktionen?
Welchen Wert haben Sie bei der Übergabe? Ich weiß auch nicht was aBitmap ist (ein TImage, ein TBitmap). Auch die Prozedur DrawBitmap kenne ich nicht, deshalb kann ich dir jetzt so nicht mehr weiterhelfen. Du kannst mir mal den Source zusenden, vielleicht finde ich dort den Fehler. Auf jeden Fall kommen mir die errechneten Pixel-Werte zu hoch vor... Grüße Mikhal |
Re: Druck-Komponente für Bitmaps
Delphi-Quellcode:
Ergebnis bei meinem Drucker mit 360/360 DPI: 360/360. aBitmap ist das Bitmap, das gedruckt werden soll. DrawBitmap tut dasselbe wie Canvas.StretchDraw. Lassen wir es gut sein...
function TPrintMGR.GetXDPI: Integer;
begin Result := GetDeviceCaps(Printer.Handle,LOGPIXELSX); end; function TPrintMGR.GetYDPI: Integer; begin Result := GetDeviceCaps(Printer.Handle,LOGPIXELSY); end; Hoffentlich fällt das Probeabo der Toolbox mit dem Release von TXPrint 2.0 zusammen ;) Danke nochmal für alles! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:01 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