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