将ImageIcon转换为Base64字符串并返回到ImageIcon而不保存到磁盘?

时间:2017-08-22 20:54:06

标签: java base64

我试图以base64字符串存储imageIcon。

这是我到目前为止所做的:

public ImageIcon getImageIcon() {
    if(imageIcon == null || imageIcon.isEmpty()){
        return null;
    } else {
        try {
            byte[] btDataFile = Base64.decodeBase64(imageIcon);
            BufferedImage image = ImageIO.read(new ByteArrayInputStream(btDataFile));
            return new ImageIcon(image);
        } catch (IOException ex) {
            System.out.println(ex.getLocalizedMessage());
            return null;
        }
    }
}

public void setImageIcon(ImageIcon imageIconIn) {
    imageIcon = Base64.encodeBase64String(imageToByteArray(imageIconIn));
}

public static byte[] imageToByteArray(ImageIcon imageIn) {
    try {

        BufferedImage image = new BufferedImage(imageIn.getIconWidth(), imageIn.getIconHeight(),BufferedImage.TYPE_INT_RGB);
        ByteArrayOutputStream b = new ByteArrayOutputStream();

        // FIX
        Graphics g;
        g = image.createGraphics();
        imageIn.paintIcon(null, g, 0,0);
        // END FIX

        ImageIO.write(image, "jpg", b );

        g.dispose();

        return b.toByteArray();

    } catch (IOException ex) {
        System.out.println(ex.getLocalizedMessage());
        return null;
    }
}

我得到一个黑色矩形而不是图像。

我在Ubuntu 16.04上使用Java 1.8。

我做错了什么?

感谢您的帮助。

********************************固定。 *********

我找到了一个有效的解决方案,并更新了上述代码。

********************************编辑************** *******************

在绘制图标后添加了g.dispose()。

1 个答案:

答案 0 :(得分:0)

此代码会创建一个全新的BufferedImage,宽度为&高度与给定图像相同。

    BufferedImage image = new BufferedImage(
        imageIn.getIconWidth(), 
        imageIn.getIconHeight(),
        BufferedImage.TYPE_INT_RGB);

请注意,图片为空。没有内容写入它。字节全部为零,RGB 0x000000为黑色。

然后,您将此黑色图像的字节写入ByteArrayOutputStream

    ByteArrayOutputStream b = new ByteArrayOutputStream();
    ImageIO.write(image, "jpg", b );
    return b.toByteArray();

当然,当您将该字节缓冲区转换回图像时,它将为黑色。

在写出字节之前,您需要将imageIn绘制/复制到新的image中。

但如果您不介意使用当前图像的格式,您可以写出该图像而不是将其转换为TYPE_INT_RGB ...

Image image = imageIn.getImage();

// write image to ByteArrayOutputStream