如何从服务器发回图像? (编辑)

时间:2017-10-03 08:30:01

标签: java image webserver qr-code

我有一个创建QRcode的网络服务器。在这个过程中,我得到一个BarcodeQRCode对象,我可以从中获取图像(.getImage())。

我不确定如何将此图像发送回客户端。我不想将其保存在文件中,只是发送回数据以响应JSON请求。 有关信息,我有一个类似的案例,我从中得到一个效果很好的PDF文件:

private ByteArrayRepresentation getPdf(String templatePath, JSONObject json) throws IOException, DocumentException, WriterException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    PdfStamper stamper = new PdfStamper(..., baos);
    // setup PDF content...
    return new ByteArrayRepresentation(baos.toByteArray(), MediaType.APPLICATION_PDF);
}

有没有办法做类似的事情或多或少:

private ByteArrayRepresentation getImage(JSONObject json) throws IOException, DocumentException, WriterException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    Image qrCode = getQRCode(json); /// return the BarcodeQRCode.getImage()

    ImageIO.write(qrCode, "png", baos);
    return new ByteArrayRepresentation(baos.toByteArray(), MediaType.IMAGE_PNG);
    }

但这不起作用。我得到:论证不匹配;图像无法转换为RenderedImage。

修改

修改后没有编译错误,如下所述。但是,返回的图像似乎是空的(或至少不正常)。如果有人知道出了什么问题,我会使用无错误的代码:

    @Post("json")
    public ByteArrayRepresentation accept(JsonRepresentation entity) throws IOException, DocumentException, WriterException {
        JSONObject json = entity.getJsonObject();
        return createQR(json);
    }

    private ByteArrayRepresentation createQR(JSONObject json) throws IOException, DocumentException, WriterException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        Image codeQR = getQRCode(json);
        BufferedImage buffImg = new BufferedImage(codeQR.getWidth(null), codeQR.getHeight(null), BufferedImage.TYPE_4BYTE_ABGR);
        buffImg.getGraphics().drawImage(codeQR, 0, 0, null);

        return new ByteArrayRepresentation(baos.toByteArray(), MediaType.IMAGE_PNG);
    }

    private Image getQRCode(JSONObject json) throws IOException, DocumentException, WriterException {
        JSONObject url = json.getJSONObject("jsonUrl");
        String urls = (String) url.get("url");
        BarcodeQRCode barcode = new BarcodeQRCode(urls, 200, 200, null);
        Image codeImage = barcode.createAwtImage(Color.BLACK, Color.WHITE);

        return codeImage;
    }

2 个答案:

答案 0 :(得分:4)

首先,将图片转换为RenderedImage

BufferedImage buffImg = new BufferedImage(qrCode.getWidth(null), qrCode.getHeight(null), BufferedImage.TYPE_4BYTE_ABGR);
buffImg.getGraphics().drawImage(qrCode, 0, 0, null);

答案 1 :(得分:0)

如果您使用com.itextpdf.text.Image,则可以使用此代码

BarcodeQRCode qrcode = new BarcodeQRCode("testo testo testo", 1, 1, null);
Image image = qrcode.createAwtImage(Color.BLACK, Color.WHITE);

BufferedImage buffImg = new BufferedImage(image.getWidth(null), image.getWidth(null), BufferedImage.TYPE_4BYTE_ABGR);
buffImg.getGraphics().drawImage(image, 0, 0, null);
buffImg.getGraphics().dispose();

File file = new File("tmp.png");
ImageIO.write(buffImg, "png", file);

我希望你能提供帮助

恩里科