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

正确的方法是在 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();

  }

}


弑天下
浏览 107回答 1
1回答

潇湘沐

屏幕和打印机是非常不同的媒体。在屏幕上,您通常具有大约 72 到 92 dpi(每英寸像素)的低分辨率。每个像素可以有大量的颜色(24m 或更多)。在打印机上,您通常具有高分辨率(高达 2540 dpi),但只有 2 (b/w) 到 6 种颜色。为了创建中间色,打印机将为您提供光栅化技术,例如半色调。您创建BufferedImage 的方式严重偏向于屏幕输出:低分辨率、使用中间颜色进行抗锯齿等。结果会很差。此外,您的输出意图丢失了。打印机驱动程序只能看到像素图。它不知道文本是否存在以及文本在哪里,也无法为其优化输出。为了提高质量,您主要有两种选择:如果您只打印线条和文本,并且只使用打印机可以创建的颜色而不混合颜色,则可以创建一个与打印机分辨率和颜色完全匹配的BufferedImage 。那应该给你一个体面的质量。否则,直接绘制到Printable。然后保留输出操作的意图,打印驱动程序可以产生最佳质量。我敢肯定,只要稍作思考,您就可以重构您的代码,使您仍然拥有一个非常易于维护的结构。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java