Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Bild drucken (https://www.delphipraxis.net/43303-bild-drucken.html)

Matze 1. Apr 2005 09:21


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:
SetMapMode(printer.Canvas.Handle, MM_LOMETRIC);
und die Breite der Seite, die für den Drucker eingestellt ist, ebenfalls:

Delphi-Quellcode:
// Seitengröße in 1/10 mm ermitteln
PageWidth := GetDeviceCaps(Printer.Canvas.Handle, HORZSIZE) * 10;
PageHeight := GetDeviceCaps(Printer.Canvas.Handle, VERTSIZE) * 10;
Klar, Millimeter ginge hier auch.

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-Referenz durchsuchenStretchBlt komme ich da, glaube ich, nicht weiter, da die Angaben in Pixel sind:

Delphi-Quellcode:
StretchBlt(Image2.Canvas.Handle, 0, 0, 100, 100, Image1.Canvas.Handle, 0, 0, 200, 200, SRCCOPY);

Khabarakh 1. Apr 2005 09:53

Re: Bild drucken
 
Ich habe SetMapMode zwar noch nie eingesetzt, aber werden die Pixelangaben von StretchBlt dann nicht automatisch auf LOMETRIC umgerechnet :gruebel: ?

Matze 1. Apr 2005 09:59

Re: Bild drucken
 
Dazu müsste aber die DPI-Auflösung des Druckers ermittelt werden, oder was meinst du?

Khabarakh 1. Apr 2005 10:33

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:
SetMapMode(printer.Canvas.Handle, MM_LOMETRIC);
StretchBlt(Printer.Canvas.Handle, 0, 0, 100, 100, Image1.Canvas.Handle, 0, 0, 100, 100, SRCCOPY);
Ein 100x100 Pixel großer Ausschnitt des Images wird auf einen 1x1 cm großen Teil des zu druckenden Blattes kopiert.

Matze 1. Apr 2005 12:45

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.

Khabarakh 1. Apr 2005 19:40

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.

Matze 1. Apr 2005 21:34

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:
Image1.Canvas.Draw(bmp, 0, 0)
erst darauf zeichnen?


Ich habe das Bild in einem Bitmap und möchte das eben in angegebenen Abmessungen ausdrucken. :gruebel:

axelf98 2. Apr 2005 00:05

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;

Matze 3. Apr 2005 00:07

Re: Bild drucken
 
Danke, kann mir sonst noch jemand helfen? ;)

SirThornberry 3. Apr 2005 10:16

Re: Bild drucken
 
du hast es doch schon fast da stehen
Delphi-Quellcode:
StretchBlt(Printer.Canvas.Handle, 0, 0, 100, 100, Image1.Canvas.Handle, 0, 0, 100, 100, SRCCOPY);
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:
Delphi-Quellcode:
StretchBlt(Printer.Canvas.Handle, AbstandVonLinks, AbstandVonOben, 100, 100, Image1.Canvas.Handle, 0, 0, 100, 100, SRCCOPY);
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.
Delphi-Quellcode:
StretchBlt(Printer.Canvas.Handle, AbstandVonLinks, -(AbstandVonOben + Image1BildhöheIn10mm), 100, 100, Image1.Canvas.Handle, 0, 0, 100, 100, SRCCOPY);
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.

Matze 3. Apr 2005 13:17

Re: Bild drucken
 
Also egal, was ich für die x- und y-Werte eingebe, mein Drucker scheint es nicht zu drucken.

Gibt es da ALternativen?

SirThornberry 3. Apr 2005 13:29

Re: Bild drucken
 
alternativ könntest du das bild nocht mit "Printer.Canvas.Pixels" per schleife malen, so hats bei mir immer geklappt, ist natürlich bissl langsammer.

Matze 20. Apr 2005 20:24

Re: Bild drucken
 
Gibt es denn gar keine Funktion, die u.a. für jeden Drucker kompatibel ist, da es ja jeder Drucker anders mit den Rändern handhabt?

SirThornberry 20. Apr 2005 20:43

Re: Bild drucken
 
mit Pixels ist es auf jedem drucker möglich (zumindest auf jedem wo ich es bisher genutzt habe) und mit SetDIBits oder so geht es auch

ol1uw 20. Apr 2005 22:52

Re: Bild drucken
 
Also bis jetzt hat dies bei mir immer funktioniert

Delphi-Quellcode:
    with printer.Canvas do
    begin
      Font.Name := 'Courier New';
      Font.Height := 80;
      Font.Style := [fsBold];
      SetTextAlign(handle, TA_CENTER + TA_TOP);
      Breite := getDevicecaps(handle, horzsize) * 10;
      Hoehe := getDevicecaps(handle, vertsize) * 10;
      // .....

      // ......
      SetTextAlign(handle, TA_CENTER + TA_TOP);
      TextOut((breite div 2), -450, ' Faxversand erfolgreich');
      Moveto(0, -510);
      Lineto(Breite, -510);
      // teilweiser Ausdruck der Faxseite
      FillRect(Rect(0, -512, Breite, (Hoehe - 512) * -1));
      StretchDraw(Rect(0, -512, Breite, (Hoehe + 512) * -1),Bitmaptemp.Graphic);
    end;
Gruß Uwe

Cicaro 3. Mai 2005 07:45

Re: Bild drucken
 
Zitat:

Zitat von Matze
Gibt es denn gar keine Funktion, die u.a. für jeden Drucker kompatibel ist, da es ja jeder Drucker anders mit den Rändern handhabt?

Du installierst doch eine Drucker-Software, wenn du einen Drucker benutzen willst. Ich denke die Infos für den zu bedruckenden Bereich findest du dort irgendwo in den Dateien bzw. in der Registry.

Ansonsten find' ich TPrinter beim Drucken sehr hilfreich. Da musst du ja nichts weiter als eine Canvas beschriften.

Cicaro 3. Mai 2005 07:49

Re: Bild drucken
 
Zitat:

Zitat von ol1uw
Also bis jetzt hat dies bei mir immer funktioniert

Delphi-Quellcode:
    with printer.Canvas do
    begin
      Font.Name := 'Courier New';
      Font.Height := 80;
      Font.Style := [fsBold];
      SetTextAlign(handle, TA_CENTER + TA_TOP);
      Breite := getDevicecaps(handle, horzsize) * 10;
      Hoehe := getDevicecaps(handle, vertsize) * 10;
      // .....

      // ......
      SetTextAlign(handle, TA_CENTER + TA_TOP);
      TextOut((breite div 2), -450, ' Faxversand erfolgreich');
      Moveto(0, -510);
      Lineto(Breite, -510);
      // teilweiser Ausdruck der Faxseite
      FillRect(Rect(0, -512, Breite, (Hoehe - 512) * -1));
      StretchDraw(Rect(0, -512, Breite, (Hoehe + 512) * -1),Bitmaptemp.Graphic);
    end;
Gruß Uwe

Vergiss aber BeginDoc und EndDoc nicht !

Matze 3. Mai 2005 07:58

Re: Bild drucken
 
Danke euch allen. Ich bekomme diese Woche einen neuen Drucker, da mein alter nicht mehr richtig druckt und meist das bedruckte Papier zerschreddert. :roll:
Dann kann ich sagen, ob es funktioniert hat. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:36 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