我将一个图像存储在oracle DB中作为byte []。
private void uploadPhoto(EntityManager em){
final JFileChooser fc = new JFileChooser();
int returnVal=fc.showOpenDialog(Shop.this);
File selected=fc.getSelectedFile();
if(returnVal==JFileChooser.APPROVE_OPTION){
BufferedImage img = null;
try {
System.out.println(selected);
img = ImageIO.read(selected);
} catch (Exception e) {
e.printStackTrace();
}
Image bufferedImage =img.getScaledInstance(lbluserPicture.getWidth(), lbluserPicture.getHeight(),
Image.SCALE_SMOOTH);
lbluserPicture.setIcon(new ImageIcon(bufferedImage));
/*
* ------------------Storing the image in the DB---------------------
*/
WritableRaster raster= img.getRaster();
DataBufferByte data=(DataBufferByte) raster.getDataBuffer();
activeUserShop.setImage(data.getData());
System.out.println("Image uploaded! Lenght: "+data.getData().length+"bytes");
EntityTransaction tx = em.getTransaction();
System.out.println(activeUserShop.toString());
tx.begin();
manager.updateUser(activeUserShop);
tx.commit();
}
有效。
然后我必须取出图像并将其设置为Jlabel上的imageIcon
private void placeMyImage(User u) {
try {
byte[] imageObtained=manager.findByUserName(u).getImage();
lbluserPicture.setIcon(new ImageIcon(imageObtained));
System.out.println(imageObtained.length);
} catch (Exception e) {
lbluserPicture.setIcon(placeDefaultImage(defaultUserImageURL));
e.printStackTrace();
}
}
但是最后一个代码似乎不起作用.bytes [] .lenght与DB中导入的图像的长度完全相同。没有e.stacktrace 打印。标签不会改变。我该怎么办?
答案 0 :(得分:3)
基本上,你正在将原始的“像素”数据写入数据库,这不是很有帮助,虽然我确信可能会把这些数据重新组合成可能有用的东西,但这一切都只是很多可以更轻松地完成的工作...
首先,使用ByteArrayOutputStream
将图像写入
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img, "png", baos);
byte[] bytes = baos.toByteArray()
activeUserShop.setImage(bytes);
System.out.println("Image uploaded! Lenght: "+bytes+"bytes");
EntityTransaction tx = em.getTransaction();
System.out.println(activeUserShop.toString());
tx.begin();
manager.updateUser(activeUserShop);
tx.commit();
然后只需使用ByteArrayInputStream
再次阅读图像
byte[] imageObtained=manager.findByUserName(u).getImage();
ByteArrayInputStream bais = new ByteArrayInputStream(imageObtained);
BufferedImage img = ImageIO.read(bais);
我应该指出,由于数组和Integer.MAX_VALUE
的限制,这仅适用于“相对”小的图像,除非您可以直接写入OutputStream
并直接从{ {1}},你必须忍受这个限制。这可能不是问题,但你应该知道它;)