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

时间:2015-12-05 11:17:05

标签: java image serialization

我想将RenderImage序列化为文本字符串,这样我就可以将java作为一个类似Jason的文件,包含一些字段(Name,Date,Photo)。

我想用

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,因为我的代码更加复杂,并且充满了递归调用,所以我想要实现这一目标的最简单方法。

你能推荐我什么?

2 个答案:

答案 0 :(得分:2)

您可以尝试使用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);
    }
}

答案 1 :(得分:0)

创建课程

// GET: Repairing/Edit/5
    public ActionResult Edit(int? id)
    {





        var vm = new ComplainDetailsVm();
        var r = db.REPAIRINGs.Find(id);
        var c = db.COMPLAINs.Find(id);
        if (r != null)
        {
            vm.REPAIRINGs = r;
            vm.COMPLAINs = c;


        }
        //ViewData["LIST_ESTIMATE_AMOUNT_OK_FROM_CUSTOMER"] = lstOKNOTOK;
        return View("EditRepairingComplain",vm);
    }

并使用任何json lib,例如GSON:

class MyImage {
  String name;
  Date date;
  String photo;
}

<强>更新: 如果序列化图像有问题,请尝试使用:

String s = new GSON.toJson(myImage).replace('{'}.replace{'}');
MyImage myImage = new GSON.fromJson("{"+s+"}", MyImage.class); 
而不是    String s = new String(utf8Bytes);    byte [] defaultBytes = original.getBytes();