在 Java 中绘制形状并在 HTTP 请求中返回浏览器

Posted

技术标签:

【中文标题】在 Java 中绘制形状并在 HTTP 请求中返回浏览器【英文标题】:Draw shape in Java and return to browser within HTTP request 【发布时间】:2018-10-05 01:29:39 【问题描述】:

我有一个 Node 应用程序,它可以绘制 x,y 图形并将其流式传输回浏览器。我使用 html 画布并将图像流式传输回我所做的 UI:

// create the canvas, set size and draw the x,y points
// ...
// ...

var buf = canvas.toBuffer();
var graph = buf.toString('base64');

var data = JSON.stringify(
    graph: graph
);

var headers = 
    'Content-Type': 'image/png'
;

res.writeHead(200, headers);
res.end(data);

现在我想用 Java 重写这个功能。我正在考虑为此目的使用java.awt.Graphics2D。我在这里创建图像:

Graphics g;
Graphics2D g2 = (Graphics2D) g;

g2.setColor(Color.red);
g2.drawRect(10,10,100,100);

然后如何在 HTTP 请求中将其返回给浏览器?

【问题讨论】:

【参考方案1】:

一个简单直接的方法是:

    写一封embedded Jetty application。 将 Graphics2D 实例转换为 RenderedImage 接口。 通过ImageIO将图形对象写入a known image format。 通过custom handler 将渲染图像导出到浏览器。

这可能类似于:

package org.eclipse.jetty.embedded;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.AbstractHandler;

public class ImageHandler extends AbstractHandler 

    public ImageHandler()  

    public void handle( final String target,
                        final Request baseRequest,
                        final HttpServletRequest request,
                        final HttpServletResponse response )
      throws IOException, ServletException
    
      final byte[] image = getImage();
      response.setHeader( "Content-Type", "image/png" );
      response.setHeader( "Content-Length", image.length );
      response.setStatus( HttpServletResponse.SC_OK );
      response.getOutputStream().write( image );

      baseRequest.setHandled( true );
    

还有getImage() 方法:

public byte[] getImage() throws IOException 
    final int width = getWidth();
    final int width = getHeight();
    final BufferedImage image = new BufferedImage( width, height, TYPE_INT_RGB );
    final Graphics2D graphics = createGraphics2D();
    graphics.drawImage( image, null, null );

    final ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageIO.write( image, "png", baos );
    baos.flush();

    final byte[] result = baos.toByteArray();
    baos.close();

    return result;


Graphics2D createGraphics2D() ... 方法中的内容完全取决于您。还必须指定图像尺寸(宽度和高度)。 TYPE_INT_RGB 常量来自 BufferedImage


请注意,可以将通过 ImageIO 写入和导出到响应输出流的步骤结合起来。这将直接将图像写入浏览器,而无需先创建数组,从而提高感知的渲染速度。

【讨论】:

以上是关于在 Java 中绘制形状并在 HTTP 请求中返回浏览器的主要内容,如果未能解决你的问题,请参考以下文章

Java 在PDF中绘制形状(基于Spire.Cloud.SDK for Java)

Java 在PDF中绘制形状(基于Spire.Cloud.SDK for Java)

图层可绘制/图层列表未在彼此之上绘制形状

在 Android Google Maps API v2 中,交通数据显示在绘制的形状(折线)上方

序列化形状以保存和重新绘制

CODESOFT中线条形状该如何绘制