为了账号安全,请及时绑定邮箱和手机立即绑定

Java - 将缓冲图像绘制为可打印与直接绘制为可打印会产生模糊结果

Java - 将缓冲图像绘制为可打印与直接绘制为可打印会产生模糊结果

弑天下 2023-03-09 15:27:45
正确的方法是在 IO 线程中实际执行逻辑,如果它是非阻塞的。否则,将请求委托给专用线程,如下所示:public class Example {  public static void main(String[] args) {    Undertow server = Undertow.builder()        .addListener(8080, "localhost")        .setHandler(new HttpHandler() {          public void handleRequest(HttpServerExchange exchange)              throws Exception {            if (valueIsPresentInCache(exchange)) {              getValueFromCache();  // non-blocking, can be done from IO thread                       } else {              if (exchange.isInIoThread()) {                exchange.dispatch(this);                // we return immediately, otherwise this request will be                // handled both in IO thread and a Worker thread, throwing                // an exception                return;              }              fetchValueFromDatabase(); // blocking!!!            }          }        })        .build();    server.start();  }}
查看完整描述

1 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

屏幕和打印机是非常不同的媒体。在屏幕上,您通常具有大约 72 到 92 dpi(每英寸像素)的低分辨率。每个像素可以有大量的颜色(24m 或更多)。在打印机上,您通常具有高分辨率(高达 2540 dpi),但只有 2 (b/w) 到 6 种颜色。为了创建中间色,打印机将为您提供光栅化技术,例如半色调

您创建BufferedImage 的方式严重偏向于屏幕输出:低分辨率、使用中间颜色进行抗锯齿等。结果会很差。此外,您的输出意图丢失了。打印机驱动程序只能看到像素图。它不知道文本是否存在以及文本在哪里,也无法为其优化输出。

为了提高质量,您主要有两种选择:

  • 如果您只打印线条和文本,并且只使用打印机可以创建的颜色而不混合颜色,则可以创建一个与打印机分辨率和颜色完全匹配的BufferedImage 。那应该给你一个体面的质量。

  • 否则,直接绘制到Printable。然后保留输出操作的意图,打印驱动程序可以产生最佳质量。我敢肯定,只要稍作思考,您就可以重构您的代码,使您仍然拥有一个非常易于维护的结构。


查看完整回答
反对 回复 2023-03-09
  • 1 回答
  • 0 关注
  • 70 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信