我想将 RenderImage 序列化为文本字符串,以便我可以使用某些字段(名称、日期、照片)java 生成类似 Jason 的文件。
我想使用
String s = String.format("%s:%s,%s:%s,%:%s",
"name", my_name,
"date", date,
"photo", someFunctionToGenerateAStringForTheImage(RenderedImage));
并将 s 保存到文件中。
目前,我正在使用这个:
public static byte[] imageToByteArray(RenderedImage img) {
try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
ImageIO.write(img, "png", out);
out.flush();
return out.toByteArray();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
我这样调用它:
String imageAsString =new String(Util.imageToByteArray(post.getImage()));
我使用以下函数反序列化字符串:
public static RenderedImage byteArrayToImage(byte[] bytes) {
try (ByteArrayInputStream in = new ByteArrayInputStream(bytes)) {
return ImageIO.read(in);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
因此我将其称为 byteArrayToImage(imageAsString.getBytes());
不幸的是,这种方法不起作用,生成的对象不一样...我想使用 String.format 因为我的代码要复杂得多并且充满了递归调用,所以我想要最简单的实现这一目标的方法。
你能给我推荐什么吗?
最佳答案
您可以尝试使用Data URL :
public static String imageToDataUrl(RenderedImage img) {
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
try {
ImageIO.write(img, "png", bytes);
} catch (IOException e) {
throw new RuntimeException(e);
}
String data = DatatypeConverter.printBase64Binary(bytes.toByteArray()),
//proper data url format
dataUrl = "data:image/png;base64," + data;
return dataUrl;
}
反序列化:
public static RenderedImage dataUrlToImage(String dataUrl) {
String data = dataUrl.substring(dataUrl.indexOf(',')+1);
byte[] bytes = DatatypeConverter.parseBase64Binary(data);
try (ByteArrayInputStream in = new ByteArrayInputStream(bytes)) {
return ImageIO.read(in);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
关于java - 如何将 RenderedImage 序列化和反序列化为文本字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34104218/