Domanda

Sto cercando di produrre un immagine generata utilizzando Play. Non sono sicuro se il mio problema è Play-specifica o meno. Sto cercando di fare la stessa cosa di questo codice PHP fa:

header("Content-type: Image/png");
$map = imagecreatefrompng("$_SESSION[ROOT]/it/cabling/maps/${building}_$floor.png");
... // add annotations
imagepng($map);

Sembra che ho bisogno di usare renderBinary, ma non sono sicuro di come ottenere da un BufferedImage alla InputStream che renderBinary vuole come suo argomento.

azione 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);
}
È stato utile?

Soluzione 2

Ho trovato un esempio nel codice sorgente per Images.Captcha che ha portato a questa soluzione:

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);
}

che viene fatto riferimento utilizzando <img id="map" src="@{Application.map(ts.building.code, ts.code)}" width="100%"> nel modello di vista.

Per qualche ragione funziona anche senza specificare il tipo di contenuto, ma io non sono sicuro di come. Il codice in Images.Captcha avuto così ho tenuto, almeno fino a quando scopro perché funziona senza di essa.

Altri suggerimenti

Ci sono una serie di metodi renderBinary, uno dei quali prende semplicemente di un file come parametro. Vedere http: // www. playframework.org/documentation/api/1.1/play/mvc/Controller.html#renderBinary(java.io.File )

Quindi, le vostre esigenze di codice per essere semplice come

public static void map(String building_code, String ts_code) throws IOException {
    renderBinary(new File("public/images/maps/" + building_code + "_" + ts_code.charAt(0)));
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top