如何从 Azure Java 函数返回 2D BufferedImage?

问题描述

在弄清楚如何从无服务器 Azure 函数返回缓冲图像时遇到问题。在 Google 上找不到任何现有示例。有没有人知道如何做到这一点?

@FunctionName("HttpExample")
public HttpResponseMessage run(
        @HttpTrigger(
            name = "req",methods = {HttpMethod.GET,HttpMethod.POST},authLevel = AuthorizationLevel.ANONYMOUS)
            HttpRequestMessage<Optional<String>> request,final ExecutionContext context) {
    context.getLogger().info("Java HTTP trigger processed a request.");

    final Integer scale = Integer.parseInt(request.getQueryParameters().get("scale"));
    final String text = request.getQueryParameters().get("text");
    final String fillColor = request.getQueryParameters().get("fillColor");

    BufferedImage bufferedImage = new BufferedImage(30 * scale,30 * scale,BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2d = bufferedImage.createGraphics();

    g2d.setColor(Color.BLACK);
    g2d.fillRect(0,30 * scale);

    g2d.setColor(Color.WHITE);
    g2d.setFont(new Font("Serif",Font.BOLD,20));
    g2d.drawString(text,10,26);

    g2d.dispose();

    if (text == null || text.trim().length() == 0) {
        return request.createResponseBuilder(HttpStatus.BAD_REQUEST).body("Please pass the 3 required parameter names.").build();
    } else {
        OutputStream out = ??????
        return request.createResponseBuilder(HttpStatus.OK)
            .body(ImageIO.write(bufferedImage,"png",out))
            .build();
    }
    
}

解决方法

我想通了。只需作为原始字节[]返回:

    } else {
        try {
        return request.createResponseBuilder(HttpStatus.OK)
            .header("Content-Type","image/png")
            .body(toByteArray(bufferedImage,"png"))
            .build();
        } catch (IOException e) {
            return request.createResponseBuilder(HttpStatus.BAD_REQUEST).body("There was an error: " + e.getMessage()).build();
        }
    }
    
}

public static byte[] toByteArray(BufferedImage bi,String format) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageIO.write(bi,format,baos);
    return baos.toByteArray();
}

我想知道是否有更好的方法来做到这一点。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...