来自byte []的JLabel图像

时间:2015-05-20 21:47:50

标签: java swing

我将一个图像存储在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 打印。标签不会改变。我该怎么办?

1 个答案:

答案 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}},你必须忍受这个限制。这可能不是问题,但你应该知道它;)