【发布时间】:2011-12-19 23:45:32
【问题描述】:
我正在编写一个 jOGL 应用程序,它允许用户打印当前渲染的屏幕截图。为了打印出渲染,我将 OpenGL 上下文的大小设置为纸张的可打印区域,然后将前端缓冲区保存到绘制到可打印画布的图像中。
应用程序还必须以尽可能高的质量打印出这些屏幕截图,因此我一直在尝试将 DPI 从默认的 72 提高到 300。但是,图像的分辨率并没有增加,而是保持不变,并且现在只占页面的大约 1/4。知道为什么会这样吗?
这是打印代码:
// Set up for printing
PrinterJob job = PrinterJob.getPrinterJob();
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
PrinterResolution pr =
new PrinterResolution(300, 300, PrinterResolution.DPI);
aset.add(pr);
aset.add(PrintQuality.HIGH);
boolean ok = job.printDialog(aset);
if (ok) {
try {
Book book = new Book();
PageFormat pf = job.getPageFormat(aset);
Paper paper = pf.getPaper();
// Halve margins
paper.setImageableArea(pf.getImageableX()/2, pf.getImageableY()/2, pf.getImageableWidth() + pf.getImageableX(), pf.getImageableHeight() + pf.getImageableY());
pf.setOrientation(PageFormat.LANDSCAPE);
pf.setPaper(paper);
book.append(glcanvas, pf, 2);
job.setPageable(book);
job.print(aset);
}
}
然后,在我的可打印对象中,调整 OpenGL 上下文的大小:
glcanvas.reshape(0, 0, (int)pf.getImageableWidth(), (int) pf.getImageableHeight() - StaticViewerUtility.HEADER_HEIGHT);
但是,PageFormat 的可成像大小永远不会改变。它保持在 72、72、468、648(即 72 DPI,在 8.5"x11" 纸上具有 1" 边距)。即使将 DPI 设置为 300,成像区域也不会改变。将其强制更高只会让打印机看到页面为任意大小(例如:22.87232“x11.8892”)并且图像仍然只打印到页面的一角。我也尝试过手动更改 OpenGL 上下文的大小,但打印输出仍然以原来的精确尺寸切割。
问题截图示例: http://img32.imageshack.us/img32/2708/capturedodg.jpg
我有什么遗漏吗?
【问题讨论】:
-
您的
glViewport()电话在哪里?它被这个“jOGL”的东西照顾了吗? -
是的,当我调用 glcanvas.reshape() 时,jOGL 会重新初始化具有视口调用 (glViewport(0, 0, windowWidth, windowHeight);) 的 OpenGL 上下文。问题是打印的可分页区域永远不会改变,因此即使在调整 OpenGL 上下文大小之前也是一个问题。