Как отправить обратно изображение с сервера? (Изм)

У меня есть веб-сервер, который создает QR-код. Во время процесса я получаю объект 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 ответа

Решение

Сначала преобразуйте изображение в RenderedImage:

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

Если вы используете 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);

Я надеюсь, что вы были полезны

Энрико

Другие вопросы по тегам