java - 如何将 RenderedImage 序列化和反序列化为文本字符串?

标签 java string image serialization

我想将 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/

相关文章:

java - 使用 openNLP maxent 训练模型

python - 如何使用 python 比较一张图像和许多其他图像之间的 SSIM?

javascript - 获取图像尺寸

C++,linux,如何从字符串中有效地 pop_back() 一个非 latin1 字符

php - 解释单引号字符串中的转义字符

android - 大 Drawable 屏幕旋转时出现内存不足错误

java - Java 中的静态方法调用是如何工作的?

java - SparkSession 初始化抛出 ExceptionInInitializerError

java - 根据 Angular 中的下拉值更改按钮的功能

c# - 如何将 char 转换为其完整的 Unicode 名称?