AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Druck-Komponente für Bitmaps

Ein Thema von Dani · begonnen am 31. Jul 2004 · letzter Beitrag vom 1. Aug 2004
Antwort Antwort
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#1

Druck-Komponente für Bitmaps

  Alt 31. Jul 2004, 00:45
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

Grüße,
Dani
Dani H.
  Mit Zitat antworten Zitat
Benutzerbild von mikhal
mikhal

Registriert seit: 11. Sep 2003
Ort: Linz am Rhein
796 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Druck-Komponente für Bitmaps

  Alt 31. Jul 2004, 12:31
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
Michael Kraemer
Computer erleichtern die Arbeit...
...und die Erde ist eine Scheibe!
  Mit Zitat antworten Zitat
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Druck-Komponente für Bitmaps

  Alt 31. Jul 2004, 16:27
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?
Dani H.
  Mit Zitat antworten Zitat
Benutzerbild von mikhal
mikhal

Registriert seit: 11. Sep 2003
Ort: Linz am Rhein
796 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Druck-Komponente für Bitmaps

  Alt 1. Aug 2004, 10:23
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
Michael Kraemer
Computer erleichtern die Arbeit...
...und die Erde ist eine Scheibe!
  Mit Zitat antworten Zitat
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Druck-Komponente für Bitmaps

  Alt 1. Aug 2004, 12:01
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.
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 DrawRect := RECT(0, 0, Printer.PageWidth, Printer.PageHeight); bis auf die unberücksichtigten nicht bedruckbaren Bereiche ganz gut.

Gruß,
Dani
Dani H.
  Mit Zitat antworten Zitat
Benutzerbild von mikhal
mikhal

Registriert seit: 11. Sep 2003
Ort: Linz am Rhein
796 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Druck-Komponente für Bitmaps

  Alt 1. Aug 2004, 12:44
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
Michael Kraemer
Computer erleichtern die Arbeit...
...und die Erde ist eine Scheibe!
  Mit Zitat antworten Zitat
Benutzerbild von mikhal
mikhal

Registriert seit: 11. Sep 2003
Ort: Linz am Rhein
796 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Druck-Komponente für Bitmaps

  Alt 1. Aug 2004, 13:46
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
Michael Kraemer
Computer erleichtern die Arbeit...
...und die Erde ist eine Scheibe!
  Mit Zitat antworten Zitat
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Druck-Komponente für Bitmaps

  Alt 1. Aug 2004, 14:14
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!
Dani H.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:04 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