Invia immagine generata al browser tramite la riproduzione quadro
-
29-09-2019 - |
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);
}
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)));
}