Нарисуйте фигуру в Java и вернитесь в браузер в HTTP-запросе - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть приложение Node, которое рисует графики x, y и передает их обратно в браузер.Я использую холст HTML и для потоковой передачи изображения обратно в пользовательский интерфейс:

// 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 Ответ

0 голосов
/ 24 апреля 2018

Простой, простой подход:

  1. Запись встроенного приложения Jetty .
  2. Преобразование экземпляра Graphics2D в интерфейс RenderedImage .
  3. Запись графического объекта в известный формат изображения через ImageIO .
  4. Экспорт отрендеренного изображения в браузер с помощью пользовательского обработчик .

Это может напоминать:

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 и экспорта в поток вывода ответа.Это позволит записать изображение непосредственно в браузер без предварительного создания массива и, следовательно, улучшить воспринимаемую скорость рендеринга.

...