gpt4 book ai didi

Java 以高于 72 DPI 的速度打印不会填满页面

转载 作者:行者123 更新时间:2023-12-02 08:03:18 25 4
gpt4 key购买 nike

我正在编写一个 jOGL 应用程序,允许用户打印当前渲染的屏幕截图。为了打印渲染,我将 OpenGL 上下文的大小设置为纸张的可打印区域,然后将前端缓冲区保存到绘制到可打印 Canvas 的图像。

应用程序还必须以尽可能高的质量打印这些屏幕截图,因此我一直在尝试将 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(即 8.5"x11"纸张上的 72 DPI,边距为 1")。即使 DPI 设置为 300,可成像区域也不会改变。将其强制更高只会让打印机看到页面为任意大小(例如:22.87232“x11.8892”),并且图像仍然只打印到页面的一角。我也尝试过手动更改OpenGL上下文的大小,但打印输出仍然是按照原来的尺寸进行切割。

问题截图示例: http://img32.imageshack.us/img32/2708/capturedodg.jpg

我有什么遗漏吗?

最佳答案

so I've been trying to up the DPI from the 72 default to 300

OpenGL 创建一个光栅图像,这意味着您有固定数量的像素。分辨率 (DPI) 告诉打印机每英寸有多少个像素。如果增加 DPI,固定数量的像素将仅覆盖较短的长度。为了弥补这一点,您需要使用 OpenGL 以相应更高的分辨率进行渲染。

从窗口拍照有问题。我强烈建议使用离屏缓冲区,例如 PBuffer 或帧缓冲区对象。

<小时/>

OpenGL 是一个针对实时图形的光栅化器,无论如何都不适合为打印机提供数据(打印机喜欢 vector 图形作为数据输入,但 OpenGL 的输出是光栅图像)。

使用 OpenGL 进行高质量打印的常用方法如下:

  • 确定目标尺寸和图像分辨率。例如。 10 英寸 × 20 英寸,300DPI。因此所需的分辨率为3000×6000像素。

  • 帧缓冲区有最大大小; OpenGL 要求至少支持 4096×4096。借助 EyeFinity 等功能,您可以获得数万像素。但假设您的实现最多只能处理 4096×4096。所以你不能把3000×6000放进去。解决方案是平铺渲染。您将图片分割为 2×3000×3000

    for t in tiles:
    glViewport(0, 0, t.width, t.height)
    glMatrixMode(GL_PROJECTION)
    glScalef(total_width / t.width, total_height / t.height, 1)
    glTranslatef(-1 + 2*total_width / t.off_x, -1 + 2*total_height / t.off_y, 0)
    your_projection()
    render_scene()

    然后将图 block 合并成一张大图片。

另一个不错的方法是将 OpenGL 转换为 vector 输出:http://geuz.org/gl2ps/ (不幸的是这个库似乎只支持立即模式)。如果您仍然想使用 GPU 并拥有可用的现代功能,您也可以使用变换反馈。

关于Java 以高于 72 DPI 的速度打印不会填满页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8569093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com