Pessoal, preciso de ajuda não encontro nada completo, preciso de dois métodos:
- 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.
- 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:
-
Solução para 1 e 2
-
Solução no nosso site 2)
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.