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);
}
¿Fue útil?

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)));
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top