Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Druck-Komponente für Bitmaps (https://www.delphipraxis.net/26885-druck-komponente-fuer-bitmaps.html)

Dani 30. Jul 2004 23:45


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

mikhal 31. Jul 2004 11:31

Re: Druck-Komponente für Bitmaps
 
Schau dir mal mein kleines Beispiel zur Druckskalierung auf meiner Site an.

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: Toolbox Magazin und ein wenig stöbern.

[edit]Ansonsten mal bei Torry nachschauen, da gibt es mit Sicherheit ebenfalls Lösungen.[/edit]

Grüße
Mikhal

Dani 31. Jul 2004 15:27

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?

mikhal 1. Aug 2004 09:23

Re: Druck-Komponente für Bitmaps
 
Zitat:

Kann man für die Werte iBlattBreite und iBlattHoehe Printer.PageWidth und Printer.PageHeight verwenden?
Ja. In der Tabelle über der Prozedur steht eigentlich erklärt, was von der Prozedur erwartet wird.
[edit]Du solltest aber vorher den nichtbedruckbaren Rand von der Breite bzw. Höhe abziehen.[/edit]

Zitat:

Entspricht (0|0) hier dem ersten Punkt auf der bedruckbaren Fläche?
Ja. Du übergibst der Prozedur doch ein Variable vom Typ TRect, also eine Fläche. Die Procedure schreibt dir dann die entsprechenden Werte (Koordinaten) für die Eckpunkte der Fläche in die übergebene Variable. Damit hast du die notwendigen Koordinaten des Rechtecks, in dem dein Bild abgedruckt wird. Deine Aufgabe ist dann letztlich noch, das diese Koordinaten auf dein Image-Objekt auf deinem Print-Obkekt zu übertragen und das Ganze auszudrucken.

Grüße
Mikhal

Dani 1. Aug 2004 11:01

Re: Druck-Komponente für Bitmaps
 
Merci!
Zitat:

Du solltest aber vorher den nichtbedruckbaren Rand von der Breite bzw. Höhe abziehen.
Woher weiß ich aber, wie groß der in Pixel ist?


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:
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;
DrawRect sieht nach dem Aufruf von DruckSkalierung so aus:
Code:
Left: 4354646
Top: 1245114
Right: 4354645
Bottom: 1245113
Dagegen klappt es mit
Delphi-Quellcode:
DrawRect := RECT(0, 0, Printer.PageWidth, Printer.PageHeight);
bis auf die unberücksichtigten nicht bedruckbaren Bereiche ganz gut.

Gruß,
Dani

mikhal 1. Aug 2004 11:44

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

mikhal 1. Aug 2004 12:46

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

Dani 1. Aug 2004 13:14

Re: Druck-Komponente für Bitmaps
 
Delphi-Quellcode:
function TPrintMGR.GetXDPI: Integer;
begin
 Result := GetDeviceCaps(Printer.Handle,LOGPIXELSX);
end;

function TPrintMGR.GetYDPI: Integer;
begin
 Result := GetDeviceCaps(Printer.Handle,LOGPIXELSY);
end;
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...
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 18:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz