Bild ausdrucken

Moin,

ich möchte gern ein/e Grafik/Bild ausdrucken. Ich habe verschiedene Beispiele aus dem Netz versucht, ein funktionierendes war bisher nicht dabei.
Eines hat gar nichts gemacht (aus unserem Wiki) und 2 andere aus dem Netz haben nur eine leere Seite ausgeworfen.

Kennt jemand ein funktionierendes Beispiel oder kann eins schreiben?

Vielleicht hier die erste antwort? (Kanns grad nicht testen)

Hilfreich waere, wenn wir wuessten WAS du bereits probiert hast…

Das sagte ich bereits, ich versuchte mehrere Beispiele aus dem Netz auszuprobieren, ohne das eins dabei gewesen wäre, das funktioniert hat.

mist, ich wollte in meinem post nen link posten, hat irgendwie nicht geklappt.
hier ist er: http://stackoverflow.com/questions/18404553/proper-way-of-printing-a-bufferedimage-in-java

ich meine was konkret…? links… codebeispiele?

Das hab ich mal fuers Drucken eines Bildes verwendet

vl hilft es

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterJob;

import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.MediaSizeName;

public class PrintImage implements Printable {
	private BufferedImage img;
	private final double resmul;

	public PrintImage(final BufferedImage img, final String fileName, final int dpi) {
		this.img = img;
		resmul = dpi / (double) 72;
		try {
			PrinterJob pjob = PrinterJob.getPrinterJob();
			PrintRequestAttributeSet as = new HashPrintRequestAttributeSet();
			as.add(MediaSizeName.ISO_A4);
			// as.add(OrientationRequested.PORTRAIT);
			// as.add(Chromaticity.MONOCHROME);
			// System.out.println("RES+ " + as.add(res));
			// as.add(PrintQuality.HIGH);
			if (pjob.printDialog(as) == false) return;

			pjob.setPrintable(this);
			pjob.setJobName("ImageView " + fileName);

			pjob.print();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

  @Override 
	public int print(final Graphics graphics, final PageFormat pageFormat, final int pageIndex) {

		System.out.println("print Started");
		if (pageIndex > 0) return NO_SUCH_PAGE;

		try {
			Graphics2D g2d = (Graphics2D) graphics;
			g2d.scale(1.0 / resmul, 1.0 / resmul);
			int ypos = (int) (pageFormat.getImageableY() * resmul);
			int xpos = (int) (pageFormat.getImageableX() * resmul);

			int screenWidth = (int) (pageFormat.getImageableWidth() * resmul);
			int screenHeight = (int) (pageFormat.getImageableHeight() * resmul);
			int imgWidth = img.getWidth();
			int imgHeight = img.getHeight();
			double iHeight = imgHeight;
			double iWidth = imgWidth;
			double hFactor = 1.0;
			double wFactor = 1.0;

			if (screenWidth >= imgWidth && screenHeight >= imgHeight) {
				g2d.drawImage(img, xpos + (screenWidth - imgWidth) / 2, ypos
						+ (screenHeight - imgHeight) / 2, null);

			} else {
				if (screenWidth < imgWidth) {
					wFactor = (double) screenWidth / (double) imgWidth;
					iWidth = screenWidth;
				}
				if (screenHeight < imgHeight) {
					hFactor = (double) screenHeight / (double) imgHeight;
					iHeight = screenHeight;
				}

				if (wFactor < hFactor) {
					iHeight = imgHeight * wFactor;

				} else if (hFactor < wFactor) {
					iWidth = imgWidth * hFactor;

				}
				g2d.drawImage(img, (int) ((screenWidth - iWidth) / 2 + xpos),
						(int) ((screenHeight - iHeight) / 2 + ypos), (int) Math.round(iWidth),
						(int) Math.round(iHeight), null);
			}
		} catch (RuntimeException e) {
			return NO_SUCH_PAGE;
		}
		return PAGE_EXISTS;
	}
}

Eins von drei, die ich ausprobiert habe findest du im Wiki. Ich kann ja nicht mal nachvollziehen, warum die nicht funktioniert haben.

@AmunRa , danke, ich probiers aus.

*** Edit ***

Dein Beispiel funktioniert! Danke.
Nun muss ich verstehen, was genau da passiert, und vielleicht finde ich auch das Problem beim Beispiel aus dem Wiki.

Ist übrigens genau das gleich wie bei dem SO post…

Das ganze was im Konstruktor passiert, sollte eigneltich selbst erklaerend sein, bis auf die Berechnung der Variable resmul

also zuerst wird ein PrinterJob angelegt, anschlieszend wird durch das attributeSet das ganze auf ein A4 Papier gesetzt.

durch pjob.printDialog(as) wird noch der Java Printdialog aufgerufen bei dem noch andere Einstellungen Hochformat/Querformat usw gemacht werden koennen.
Mit pjob.setPrintable() wird noch das Printable erzuegt das dann den tatsaechlichen Druck duchfuehrt.
in der print() Methode wird einfach auf das Graphics Object gezeichnet.

resmul steht einfach fuer Resolution Multiplier. und dadurch wird berechnet mit welcher aufloesung das ganze gedruckt wird.
In java wird normalerweise mit einer Aufloesung von 72 dpi gedruckt, durch resmul wird einfach das ganze dann skalliert. wenn du das nicht brauchst, dann kannst du diese ganzen skallierungen einfach entfernen.