Ich möchte ein Bild in Java machen und es auf einem 300 dpi Etikettendrucker auf einem Etikett von 150 x 100 mm drucken. Wie kann ich das Bild so machen, dass eine Linie (oder was für ein Element) genau an Position (10,10) (in Millimetern) gedruckt wird, und diese Linie an Position (10,50) endet?
Mit anderen Worten: Meine Herausforderung besteht nicht darin, eine Linie zu erstellen (ich verwende Graphics2D, bufferedImage), sondern wie man genau bestimmen kann, wo diese Linie (in Millimetern) auf dem Etikett sein muss.
Irgendwelche Ideen?
Java's print API geht grundsätzlich davon aus, dass alles mit 72 dpi erledigt wird. Dies bedeutet, dass Sie dies als Basis für die Konvertierung zu / von verschiedenen Messungen verwenden können ...
Dies bedeutet nur, dass Sie Werte und Zielmessungen benötigen und starten ...
%Vor%Um das Bild mit 10 mm x 10 mm zu drucken, müssten Sie dies in Pixel pro Zoll
umwandeln %Vor%Sie werden wahrscheinlich auch darüber nachdenken müssen, das Bild möglicherweise zu verkleinern, damit es in den bedruckbaren Bereich passt.
Für einige Beispiele ...
Aktualisierung mit Testergebnissen
Also habe ich ein paar Tests gemacht (Code folgt) ...
Zuerst habe ich ein PrintRequestAttributeSet
eingerichtet, um nur Druckdienste anzufordern, die 300x300 dpi unterstützen können ...
Beim Drucken wurde meine Printable
eine bebilderbare Fläche von 425,20 x 283,46 Pixeln übergeben, was 15,03 x 10,02 cm @ 72 dpi (ungefähr) entspricht. So funktioniert Java, seine grundlegende Druck-API hat immer mit der Annahme von 72 dpi gearbeitet.
Also. Wenn ich ein Bild von 10 x 50 mm bei 72 DPI bereite, erhalte ich eine Bildgröße von 28,346 x 141,732 Pixel, die leicht in den bebilderbaren Bereich (von 425,20 x 283,46) passt.
Wenn ich jedoch 300 dpi verwende, erhalte ich eine Bildgröße von 118,11 x 590,551 Pixel, was uns in Schwierigkeiten bringen wird und es erforderlich macht, das Bild zu verkleinern ...
Dies kann tatsächlich wünschenswert sein, Sie müssen einige Tests durchführen, um herauszufinden.
%Vor%Nun, es gibt viele Dinge zu beachten, von denen die meisten grundlegende Mathematik ist. Ich bin mit Java2D nicht besonders vertraut, daher kann ich Ihnen nicht sagen, ob es Hilfsfunktionen gibt, aber hier ist die Mathematik:
150 x 100 Millimeter ist ungefähr 6x4 Zoll. Bei 300 DPI benötigen Sie eine Pixelauflösung von 1800x1200.
1 "ist gleich 300 Pixeln und entspricht 25,4 mm, was bedeutet, dass 1 mm etwa 12 Pixel (11,8) entspricht.
Wenn Sie also eine Linie erstellen möchten, die mit 10x10mm beginnt, müssen Sie diese mit der Anzahl der Pixel in mm multiplizieren, in diesem Fall also 12. Zeichnen Sie also Ihre Linie mit 120x120 Pixeln.
Wenn Sie die Linie bei 10x50mm beenden möchten, müssen Sie die Linienzeichnung bei 120x600 beenden.
Die Mathematik ist in jedem Fall anders, je nachdem, welche Auflösung der Drucker druckt, aber für die gestellte Frage sollten diese Zahlen ausreichen.
Ich hoffe, es hat geholfen.
Bei meinen Tests mit einem Brother DPC-135C Drucker durch Ausführen eines bearbeiteten Programms von MadProgrammer oben durch Kommentieren der folgenden Zeilen:
%Vor%Ich denke, die g2d.drawRect () oben korrekt die gesamte mediaprintablearea umfasst wie definiert in SDK pageFormat.getImageableWidth () und pageFormat.getImageableHeight () einen Wert in 1/72 Zoll zurück. Zum Beispiel pageFormat.getImageableWidth () zurückkehr 451,2755 451,2755 bedeutet / 72 = ~ 6.26 inches Breite des druckbaren Bereichs. Also von pageFormat.getImageableX Starten (), (int) pageFormat.getImageableY () jeder Millimeter beträgt etwa 2,8346 Einheiten (72 Einheiten beträgt 1 Zoll, 1 Zoll = 25,4 mm). So zeichnen Sie das Bild (Die Pixel des Bildes werden so skaliert, dass sie der angegebenen Breite und Höhe entsprechen):
%Vor%Im Druckdialog müssen Sie die Ränder entfernen. Einstellen der Punkte pro Zoll wie der Code oben MadProgrammer denke ich Verwirrungen um die Messung von dem, was genau ist ein Zoll im Ausdruck (Bezüglich dem, was in dem SDK angegeben wird, die pageFormat.getImageableWidth () und pageFormat.getImageableHeight () gibt in 1 / 72 Zoll). Bei meinen Tests habe ich das gedruckte Bild mit einem Lineal gemessen und es ist ziemlich genau.
Tags und Links java