Enviar imagen generada al navegador usando Juego marco
-
29-09-2019 - |
Pregunta
Estoy tratando de salida de una imagen generada por el uso de Juego. No estoy seguro de si mi problema es Play-específica o no. Estoy tratando de hacer lo mismo que el código PHP hace:
header("Content-type: Image/png");
$map = imagecreatefrompng("$_SESSION[ROOT]/it/cabling/maps/${building}_$floor.png");
... // add annotations
imagepng($map);
Parece que necesito utilizar renderBinary
, pero no estoy seguro de cómo llegar desde un BufferedImage
a la InputStream
que renderBinary
quiere como su argumento.
acción 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);
}
Solución 2
I encontró un ejemplo en el código fuente de Images.Captcha
que condujo a esta solución:
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);
}
que se referencia mediante <img id="map" src="@{Application.map(ts.building.code, ts.code)}" width="100%">
en la plantilla de vista.
Por alguna razón que funciona incluso sin especificar el tipo de contenido, pero no estoy seguro de cómo. El código en Images.Captcha
lo tenía, así que cuidado que, al menos hasta que averigüe por qué funciona sin él.
Otros consejos
Hay un número de métodos renderBinary, uno de los cuales toma simplemente un archivo como un parámetro. Ver http: // www. playframework.org/documentation/api/1.1/play/mvc/Controller.html#renderBinary(java.io.File )
Por lo tanto, sus necesidades de código para ser tan simple como
public static void map(String building_code, String ts_code) throws IOException {
renderBinary(new File("public/images/maps/" + building_code + "_" + ts_code.charAt(0)));
}