RESOLVIDO: Ajuda para trabalhar com Imagem Blob no MySQL

Pessoal, preciso de ajuda não encontro nada completo, preciso de dois métodos:

  1. Que receba uma String que é o caminho de uma determinada imagem, converta esta imagem e retorne ela em MediumBlob para que seja armazenado no BD MySQL.
  2. Que receba o MediumBlob vindo do MySQL, converta e retorne em imagem para que seja apresentado na tela num JPanel por exemplo.
1 curtida

Respostas:


Código:

  • Imagem para Byte

    public byte[] imageToByte(String image) throws IOException {
      InputStream is = null;
      byte[] buffer = null;
      is = new FileInputStream(image);
      buffer = new byte[is.available()];
      is.read(buffer);
      is.close();
      return buffer;
    }  
    
  • Byte para Imagem

    public void ByteToImage(byte[] bytes) throws Exception {
      byte[] imgBytes = bytes;
      try {
          FileOutputStream fos = new FileOutputStream("/home/fabricio/Imagens/java.jpg");
          fos.write(imgBytes);
          FileDescriptor fd = fos.getFD();
          fos.flush();
          fd.sync();
          fos.close();
          } catch (Exception e) {
              throw new Exception(    "Erro ao converter os bytes recebidos para imagem");
          }
    }
    

Referencia e creditos dos dois códigos: Convertendo imagem para byte e byte para imagem de CarlinoFR

Na verdade o tipo de campo na sua base é um Blob que nada mais é que um array de bytes

Não estava conseguindo utilizar o exemplo ByteToImage pois preciso que receba o blob e converta em imagem num componente JLabel, quando dava um JLabel.setIcon dava erro pois ele pede uma string (File) e estava passando Byte, como preciso apenas que mostre a imagem no componente consegui resolver essa etapa convertendo Blob em Byte, Byte em Image e Image em ImageIcon. Seu exemplo foi fundamental para conseguir chegar na solução, segue primeira solução:

//Recebendo blob do BD e colocando num JLabel 
    public void blobToImage(Blob blobBD, JLabel label) throws Exception {
        //Converte blob em Image
        byte[] image = blobBD.getBytes(1, (int) blobBD.length());
        Image img = Toolkit.getDefaultToolkit().createImage(image);

        //Escala imagen dentro do JLabel (no meu caso o JLabel possui: 272 por 192)
        Image newimg = img.getScaledInstance(272, 192, java.awt.Image.SCALE_SMOOTH);
        ImageIcon imageIcon = new ImageIcon(newimg);

        //Apresenta a imagem no componente JLabel
        label.setIcon(imageIcon);
    }

Agora para pegar a imagem selecionada e inserir no BD fiz da seguinte forma:

No actionPerformance do botão que seleciona a imagem temos o código:

JFileChooser fc = new JFileChooser();
        fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
        int res = fc.showOpenDialog(null);
        if (res == JFileChooser.APPROVE_OPTION) {
            File arquivo = fc.getSelectedFile();
            
            //Limpa a imagem atual do JLabel
            txtFoto.setIcon(null);
            imagemPath = arquivo.getAbsolutePath();

            //Seta a imagem selecionada
            Image img = new ImageIcon(arquivo.getAbsolutePath()).getImage();

            //Redimensiona a imagen
            Image newimg = img.getScaledInstance(280, 192, java.awt.Image.SCALE_SMOOTH);
            ImageIcon imageIcon = new ImageIcon(newimg);

            //Seta a imagem ao componente JLabel
            txtFoto.setIcon(imageIcon);
        }else{
            imagemPath = null;
        }

Lá no botão salvar tenho a linha que faz o Set deste campo:

bean.setFotoPatch(imagemPath);//Grava o caminho da imagem selecionada que será utilizado na classe DAO

Lá na classe DAO onde tenho o INSERT e UPDATE faço da seguinte forma na linha referente a este campo:

if (bean.getFotoPatch() != null) {
                InputStream is;
                is = new FileInputStream(new File(bean.getFotoPatch()));
                pstm.setBlob(4, is);
            } else if (bean.getFotoPatch() == null) {
                pstm.setBlob(4, (Blob) null);
            }

Tudo rodando perfeito, obrigado.