我试图以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()。
答案 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