如何在Java中将字符串的List <string>转换为BufferedImage

时间:2019-04-10 19:03:49

标签: java string decode bufferedimage

我想将Base64字符串数组转换为static BufferedImage decodeToImage(List<String> imageStrings) { BufferedImage image = null; ByteBuffer imageByteBuffer = ByteBuffer.allocate(500000000); try { BASE64Decoder decoder = new BASE64Decoder(); for (String imageString : imageStrings) { imageByteBuffer.put(imageString.getBytes()); } ByteArrayInputStream bis = new ByteArrayInputStream(imageByteBuffer.array()); image = ImageIO.read(bis); bis.close(); } catch (Exception e) { e.printStackTrace(); } return image; } 。 我尝试完成的方法:

BufferedImage

我想返回一个 return ( <div id="excel"> <BuilderWrapper className="builderWrapper"> <Header name={name} desc={description} exportHandler={this.exportHandler} showData={this.showData} /> <BuilderNotification> <Message infoMessage={cmsContent.messageOnExcelSheet} /> </BuilderNotification> <BuilderSpreadsheet> **<HotTable ref={this.hotTableComponent} {...this.setting} className={headerBoldCustom} />** </BuilderSpreadsheet> <HotFooter dimensions={dimensions} /> </BuilderWrapper> </div> );,但它返回null。

4 个答案:

答案 0 :(得分:2)

您可以使用此功能:

public static BufferedImage decodeToImage(List<String> imageStrings) {
    try {
        byte[] bytes = Base64.getDecoder().decode(String.join("", imageStrings));
        return ImageIO.read(new ByteArrayInputStream(bytes));
    } catch (IOException e) {
        throw new UncheckedIOException(e);
    }
}

答案 1 :(得分:1)

你看过你要干什么吗?

导致此代码

public static void main(String[] args) {
    String base64String = "data:image/png;base64,iVBORw0...=";
    String[] strings = base64String.split(",");
    List<String> param = new ArrayList<String>();
    param.add(strings[1]);
    BufferedImage bi = decodeToImage(param);
    System.out.println("BufferedImage: " + bi);
}

static BufferedImage decodeToImage(List<String> imageStrings) {
    BufferedImage image = null;
    ByteBuffer imageByteBuffer = ByteBuffer.allocate(500000000);
    try {
        for (String imageString : imageStrings) {
          imageByteBuffer.put(DatatypeConverter.parseBase64Binary(imageString));
        }
        ByteArrayInputStream bis = new ByteArrayInputStream(imageByteBuffer.array());
        image = ImageIO.read(bis);
        bis.close();
    } catch (Exception e) {
        System.out.println("error?");
        e.printStackTrace();
    }
    return image;
}

将打印

BufferedImage:BufferedImage @ 7eda2dbb:type = 6 ColorModel:#pixelBits = 32 numComponents = 4 color space = java.awt.color.ICC_ColorSpace@6576fe71透明度= 3 has alpha = true isAlphaPre = false ByteInterleavedRaster:width = 302 height = 232 #numDataElements 4 dataOff [0] = 3

但是,如果我只给出整个base64文本,并且图像信息位于前面

 public static void main(String[] args) {
    String base64String = "data:image/png;base64,iVBORw0...=";
    String[] strings = base64String.split(",");
    List<String> param = new ArrayList<String>();
    param.add(base64String); //THIS IS THE DIFFERENT LINE
    BufferedImage bi = decodeToImage(param);
    System.out.println("BufferedImage: " + bi);
    }

它将显示为空

将base64String替换为有效的base 64编码自png的

http://freeonlinetools24.com/base64-image

在此示例中,我将其剪切掉了,因为否则它将变成数千个字符。

答案 2 :(得分:1)

Java 真正中字符串的最大长度是否对您的代码有问题?如果没有,我会像这样简化您的代码(并修复解码错误):

static BufferedImage decodeToImage(String imageString) {
    try {
        BASE64Decoder decoder = new BASE64Decoder();    
        return ImageIO.read(new ByteArrayInputStream(decoder.decode(imageString)));
    } catch (IOException e) {
        e.printStackTrace();
    }

    return null;
}

或者,如果您确实对字符串的长度有疑问(Base64的输出长度长于输入的长度,那么 在极端情况下可能有意义,但请对此进行验证,否则无需添加代码),请保留字符串列表。我会跳过ByteBuffer,而改用ByteArrayOutputStream,因为它更容易使用。

static BufferedImage decodeToImage(List<String> imageStrings) {
    try {
        ByteArrayOuputStream buffer = new ByteArrayOuputStream();

        BASE64Decoder decoder = new BASE64Decoder();
        for (String imageString : imageStrings) {
            buffer.write(decoder.decode(imageString));
        }

        return ImageIO.read(new ByteArrayInputStream(buffer.toArray()));
    } catch (IOException e) {
        e.printStackTrace();
    }

    return null;
}

PS:虽然通常应该关闭流,但是close()ByteArrayInputStream上的ByteArrayOutputStream方法是无操作的。

答案 3 :(得分:0)

使用缓冲区有点棘手。最好在这里看看: https://docs.oracle.com/javase/7/docs/api/java/nio/Buffer.html#flip()

据我所记得,您必须先准备好缓冲区才能读取它;必须将内部“光标”的位置设置为起始位置,然后您才能从该位置读取“容量”字节。 好吧,正如我所说:据我所记得。大约十二年前,我不得不直接使用缓冲区。