作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想将 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/
我是一名优秀的程序员,十分优秀!