impresión de imágenes almacenadas en una impresora

Tengo una aplicación desde la que quiero imprimir una imagen. La imagen se carga como un objeto BufferedImage. El problema es que cuando imprimo la imagen (en la posdata o en el archivo pdf), la calidad es realmente pobre.
Cuando estoy usando algunas otras herramientas (básicamente cualquier aplicación de visor de imágenes que pueda imprimir la imagen) el resultado es significativamente mejor.
Sé que puede haber algunos problemas con la resolución DPI vs resolución, pero no estoy exactamente seguro de cómo calcular los valores correctos para la impresión.
Traté de buscar en Google y probé algunos métodos, pero nada parece funcionar como esperaba. Básicamente, solo quiero imprimir una imagen (en resolución, digamos 3000x2000) en una impresora (con DPI, por ejemplo 600x600).

Así es como creo el trabajo de impresión:

PrintRequestAttributeSet printAttributes = new HashPrintRequestAttributeSet();
printAttributes.add(PrintQuality.HIGH);
printAttributes.add(new PrinterResolution(600, 600 PrinterResolution.DPI)); 
printAttributes.add(new Destination(URI.create("file:/tmp/test.ps")));
PageFormat pf = printerJob.defaultPage();
Paper paper = pf.getPaper();
double xMargin = 0.0;
double yMargin = 0.0;
paper.setImageableArea(xMargin, yMargin, paper.getWidth() - 2 * xMargin, paper.getHeight() - 2 * yMargin);
pf.setPaper(paper);

// create new Printable for the specified image
printerJob.setPrintable(PrintableImage.get(image), pf)

if (printerJob.printDialog(printAttributes)) {
    printerJob.print(printAttributes);
}

DóndeimageesBufferedImage y PrintableImage.get devuelve una nueva instancia que implementaImprimibl Entonces la impresión real está haciendo de esta manera (dejé el código comentado que probé pero no funcionó para mí)

@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
if (image == null)
    throw new PrinterException("no image specified to be printed");

// We have only one page, and 'page' is zero-based
if (pageIndex > 0) {
    return NO_SUCH_PAGE;
}

// tranlate the coordinates (according to the orientations, margins, etc)
Graphics2D printerGraphics = (Graphics2D) graphics;

//g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
//g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
//g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);

printerGraphics.translate(pageFormat.getImageableX(), pageFormat.getImageableY());

// THIS IS A TEST - javax.printing api uses 72 DPI, but we have 600DPI set for the printer
//AffineTransform at = printerGraphics.getTransform();
//printerGraphics.scale((double)72 / (double)600, (double)72 / (double)600);
//printerGraphics.drawRenderedImage(image, null);
//printerGraphics.setTransform(at);
//if(printerGraphics != null)
    //return PAGE_EXISTS;

double scale = 72.0 / 600.0;

Dimension pictureSize = new Dimension((int)Math.round(image.getWidth() / scale), (int) Math.round(image.getHeight() / scale));


// center the image horizontaly and verticaly on the page
int xMargin = (int) ((pageFormat.getImageableWidth() - image.getWidth()) / 2);
int yMargin = (int) ((pageFormat.getImageableHeight() - image.getHeight()) / 2);
xMargin = yMargin = 0;

System.out.println(String.format("page size [%.2f x %.2f], picture size [%.2f x %.2f], margins [%d x %d]", pageFormat.getImageableWidth(), pageFormat.getImageableHeight(), pictureSize.getWidth(), pictureSize.getHeight(), xMargin, yMargin));

printerGraphics.drawImage(image, xMargin, yMargin, (int)pageFormat.getWidth(), (int)pageFormat.getHeight(), null);

//printerGraphics.drawImage(image, 0, 0, null);
//printerGraphics.drawImage(image, xMargin, yMargin, pictureSize.width, pictureSize.height, null);
//printerGraphics.drawImage(image, xMargin, yMargin, (int) pageFormat.getImageableWidth(), (int) pageFormat.getImageableHeight(), 0, 0, pictureSize.width, pictureSize.height, null);
//printerGraphics.drawImage(image, 0, 0, (int) pageFormat.getWidth() - xMargin, (int) pageFormat.getHeight() - yMargin, 0, 0, pictureSize.width, pictureSize.height, null);

return PAGE_EXISTS;
}

¿Alguien resuelve el mismo problema?
Cualquier ayuda sería apreciada
Gracia
Matej

Respuestas a la pregunta(4)

Su respuesta a la pregunta