Простой, простой подход:
- Запись встроенного приложения Jetty .
- Преобразование экземпляра Graphics2D в интерфейс RenderedImage .
- Запись графического объекта в известный формат изображения через ImageIO .
- Экспорт отрендеренного изображения в браузер с помощью пользовательского обработчик .
Это может напоминать:
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 и экспорта в поток вывода ответа.Это позволит записать изображение непосредственно в браузер без предварительного создания массива и, следовательно, улучшить воспринимаемую скорость рендеринга.