Hi,
ich muss noch einen Fehler in meiner Klasse haben, in der ich ein auszudruckendes Bild skaliere. Das Problem ist, dass das Bild immer noch etwas zu groß ist, um komplett gedruckt zu werden, die Seitenränder werden anscheinend noch nicht korrekt berechnet.
Am besten hinterlege ich hier Teile des Codes, bevor ich es noch weiter beschreibe:
Danke für eure Hilfe und Zeit vorab! :wink:
ich muss noch einen Fehler in meiner Klasse haben, in der ich ein auszudruckendes Bild skaliere. Das Problem ist, dass das Bild immer noch etwas zu groß ist, um komplett gedruckt zu werden, die Seitenränder werden anscheinend noch nicht korrekt berechnet.
Am besten hinterlege ich hier Teile des Codes, bevor ich es noch weiter beschreibe:
Code:
/** Spacer für die Anordnung auf dem Ausdruck */
public final static int SPACER = 3;
[...]
public int print(Graphics graphics,
PageFormat pageFormat, int pageIndex)
throws PrinterException
{
if( 0 != pageIndex )
{
return NO_SUCH_PAGE;
}
// Die Ausgangskoordinaten des Druckbereichs
int startPositionX=1, startPositionY=1;
// Skalieren der zulässigen Höhe und Breite des Druckbereichs im
// Zusammenhang mit dem Auflösungsmultiplikator
int maxWidth = (int)Math.round( pageFormat.getImageableWidth() *
RESOLUTION_MUL ) - SPACER;
int maxHeight = (int)Math.round( pageFormat.getImageableHeight() *
RESOLUTION_MUL ) - SPACER;
// Objekt erzeugen, dass den Druck durchführt
Graphics2D g2D = (Graphics2D)graphics;
// Größe der Druckränder berücksichtigen / anschl. Auflösung skalieren
g2D.translate(pageFormat.getImageableX(),
pageFormat.getImageableY());
g2D.scale(1.0/RESOLUTION_MUL, 1.0/RESOLUTION_MUL);
// Bild wenn erforderlich skalieren
transformImage(maxWidth,maxHeight);
AffineTransform at = new AffineTransform();
Point point = new Point(0,0);
at.translate(point.x, point.y);
/* Zeichne das Bild mit folgender AffineTransform-Matrix:
* [1 0 0]
* [0 1 0]
* [0 0 1]
*/
g2D.drawRenderedImage(image, at);
/*System.out.println( "Seite liegt vor.");*/
return PAGE_EXISTS;
}
[...]
/**
* Die Methode transformImage prüft zunächst, ob das zu druckende
* Bild zu groß für den druckbaren Bereich ist. Ist das der Fall, wird
* das Bild skaliert.
* @param maxWidth max. Breite des druckbaren Bereichs
* @param maxHeight max. Höhe des druckbaren Bereichs
*/
private void transformImage(int maxWidth, int maxHeight)
{
if( image.getWidth()>maxWidth || image.getHeight()>maxHeight )
{
double scaleFactor = ((double)maxWidth) /
((double)image.getWidth());
// Skalierungsfaktor ist hier noch viel zu genau, auf 2
// Nachkommastellen runden.
scaleFactor = Math.rint(scaleFactor*100)/100.0;
// So viel Speicher wie möglich für die Transformation bereitstellen
System.gc();
// Transformation durchführen.
System.out.println("Skalierungsfaktor:" + scaleFactor);
ParameterBlock pb = new ParameterBlock();
pb.addSource(image);
pb.add( (float)scaleFactor );
pb.add( (float)scaleFactor );
pb.add(0.0f);
pb.add(0.0f);
pb.add(new InterpolationNearest());
// PlanarImage aus den im Parameterblock enthaltenen Werten
// erzeugen.
image = JAI.create("scale", pb);
}
}
Danke für eure Hilfe und Zeit vorab! :wink: