2010-11-08 4 views
3

Я пытаюсь вывести сгенерированное изображение с помощью Play. Я не уверен, что моя проблема связана с Play-specific или нет. Я пытаюсь сделать то же самое, это PHP код делает:Отправлено сгенерированное изображение в браузер с помощью Play framework

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

ответ

3

Я нашел пример в исходном коде для 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 имел это, поэтому я сохранил его, по крайней мере, до тех пор, пока не выясню, почему он работает без него.

+0

Почему вы создаете ImageInputStream, он не используется позже? –

+0

@ AlexanderKjäll еще один артефакт перенесен из метода, который я скопировал - я не был уверен, что он сделал, поэтому я просто оставил его, предполагая, что у авторов рамок есть причина для этого. Вы, конечно же, можете попытаться удалить его. –

3

Есть целый ряд 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))); 
} 
+0

Я должен был уточнить свой вопрос, но я не просто показываю изображение так, как есть. Я загружаю базовое изображение, на которое я собираюсь наложить некоторую информацию, а затем мне нужно сделать результат. –

+0

Ах, в этом случае решение @bemace должно предложить вам ответ. – Codemwnci