Отправить сгенерированное изображение в браузер с помощью Play Framework
-
29-09-2019 - |
Вопрос
Я пытаюсь вывести сгенерированное изображение, используя воспроизведение. Я не уверен, является ли моя проблема специфична для игры или нет. Я пытаюсь сделать то же самое, что делает этот PHP -код:
header("Content-type: Image/png");
$map = imagecreatefrompng("$_SESSION[ROOT]/it/cabling/maps/${building}_$floor.png");
... // add annotations
imagepng($map);
Похоже, мне нужно использовать renderBinary
, но я не уверен, как получить от BufferedImage
в InputStream
тот renderBinary
хочет как его аргумент.
Application.map
действие:
public static void map(String building_code, String ts_code) throws IOException {
BufferedImage image = ImageIO.read(new File("public/images/maps/" + building_code + "_" + ts_code.charAt(0)));
... // Overlay some additional information on the image
// do some sort of conversion
renderBinary(inputStream);
}
Решение 2
Я нашел пример в исходном коде для Images.Captcha
что привело к этому решению:
public static void map(String building_code, String ts_code) throws IOException {
BufferedImage image = ImageIO.read(new File("public/images/maps/" + building_code + "_" + ts_code.charAt(0) + ".png"));
... // add annotations
ImageInputStream is = ImageIO.createImageInputStream(image);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "png", baos);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
Response.current().contentType = "image/png";
renderBinary(bais);
}
который ссылается с использованием <img id="map" src="@{Application.map(ts.building.code, ts.code)}" width="100%">
В шаблоне представления.
По какой -то причине это работает даже без указания типа контента, но я не уверен, как. Код в Images.Captcha
Если бы я держал это, по крайней мере, пока не узнаю, почему это работает без него.
Другие советы
Существует ряд методов Renderbinary, один из которых просто принимает файл в качестве параметра. Видеть http://www.playframework.org/documentation/api/1.1/play/mvc/controller.html#renderbinary(java.io.file)
Итак, ваш код должен быть таким же простым, как
public static void map(String building_code, String ts_code) throws IOException {
renderBinary(new File("public/images/maps/" + building_code + "_" + ts_code.charAt(0)));
}