AGB  ·  Datenschutz  ·  Impressum  







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

Bild drucken

Ein Thema von Matze · begonnen am 1. Apr 2005 · letzter Beitrag vom 3. Mai 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#1

Bild drucken

  Alt 1. Apr 2005, 10:21
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:

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:

StretchBlt(Image2.Canvas.Handle, 0, 0, 100, 100, Image1.Canvas.Handle, 0, 0, 200, 200, SRCCOPY);
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#2

Re: Bild drucken

  Alt 1. Apr 2005, 10:53
Ich habe SetMapMode zwar noch nie eingesetzt, aber werden die Pixelangaben von StretchBlt dann nicht automatisch auf LOMETRIC umgerechnet ?
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Bild drucken

  Alt 1. Apr 2005, 10:59
Dazu müsste aber die DPI-Auflösung des Druckers ermittelt werden, oder was meinst du?
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#4

Re: Bild drucken

  Alt 1. Apr 2005, 11:33
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.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Bild drucken

  Alt 1. Apr 2005, 13:45
Sicher, dass es 1 x 1 cm sind?
Logischer wäre in dem Falle 10 x 10 cm

Ich werde es gegen später ausprobieren, danke.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#6

Re: Bild drucken

  Alt 1. Apr 2005, 20:40
Ich wollte mich schon entschuldigen, stimmt aber doch . MM_LOMETRIC hat die Maßeinheit 1/10 mm, also 100 Pixel => 1 cm.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Bild drucken

  Alt 1. Apr 2005, 22:34
Aber "MM", naja, das ist ja dann das kleinste Problem.

Wie drucke ich denn da genau ein Bild? Muss ich es mittels

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.
  Mit Zitat antworten Zitat
axelf98

Registriert seit: 27. Aug 2003
Ort: Ennepetal
440 Beiträge
 
Delphi 2005 Personal
 
#8

Re: Bild drucken

  Alt 2. Apr 2005, 01:05
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;
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Bild drucken

  Alt 3. Apr 2005, 01:07
Danke, kann mir sonst noch jemand helfen?
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Bild drucken

  Alt 3. Apr 2005, 11:16
du hast es doch schon fast da stehen
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:
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.
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 09:00 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