Estou tentando inserir uma imagem que está armazenada no banco em uma jlabel. Estou usando um código que busquei aki no fórum, porém não esta dando certo.
Se alguém puder me dizer o que estou fazendo de errado. Estou fazendo assim:
File file = new File(mostrar.get(0).getDataNascimento());
BufferedImage bi = ImageIO.read(file);
BufferedImage aux= new BufferedImage(100, 200, bi.getType());
Graphics2D g = aux.createGraphics();
AffineTransform at= AffineTransform.getScaleInstance((double)200/bi.getWidth(),(double)100/bi.getHeight());
g.drawRenderedImage(bi, at);
jLabel1.setIcon(new ImageIcon(aux));
O que está no banco? Os dados da imagem (em um blob) ou o caminho da imagem?
No caso, o erro é bem claro. O read não conseguiu encontrar o arquivo que você está pedindo para ele abrir.
Dani_Gomes
O arquivo que estou inserindo é do tipo bytea.
Estou usando o postgres, que não possui o tipo blob. Também estou inserindo com FileInputStream, não sei se está correto, mas foi o jeito que consigui inserir no banco, se tiver algum jeito de fazer mais fácil.
ViniGodoy
Não vale copiar e colar código sem entender o que o código tá fazendo.
Você inseriu os bytes da imagem com um InputStream, mas está lendo como se só o nome do arquivo estivesse gravado no banco. Aí não funciona mesmo.
Se for uma aplicação web, grave apenas o nome do arquivo no banco, e deixe a imagem em algum lugar do sistema de arquivos do servidor. Nesse caso, sua coluna poderá ser um VARCHAR simples.
Se for uma aplicação desktop, você pode fazer o mesmo com uma pasta de rede ou, se for monousuário, com uma pasta local. É bastante simples.
PS: Blob é o nome genérico que se dá para qualquer campo que contenha um monte de dados binários com algum objeto dentro, como o caso do bytea. De fato, Blob é a sigla de Binary Large Object Buffer.
Dani_Gomes
Foi mal a cópia do código, mas é que no post que eu vi tinha uns comentários que diziam que faziam algo. E quando eu fui testar, os comentários não correspondiam ao que diziam.
Mas acredito que o seu post me clareou mais. Não utilizarei todo ele, pois minha aplicação busca a imagem que minha cam tira e grava num diretório, dai esta imagem é a que vai para o banco.
Por enquanto agradeço.
Dani_Gomes
Caro, ViniGodoy.
Como minha aplicação utiliza a cam, então ela tem que primeiramente escrever o arquivo para depois poder lê-lo.
Quando você utiliza o seu método:
Você diz que a imagem já está transformada em bufferedImage, minha dúvida é se nesta linha você já não está escrevendo ela como uma bufferdImage?
Seria necessário transformá-la antes disto?
Também gostaria de saber se para mim retorná-la do banco, quando eu faço o select, tenho que escrevê-la em algum diretório, para só depois poder inserí-la em um jpanel ou jlabel?
Ou tem algum jeito mais fácil.
Também gostaria de saber sobre este jImagePanel que está no seu código. Sou obrigado a utilizá-lo ou eu posso setar num jpanel comum?
Agradeço a ajuda.
ViniGodoy
Oi. Aquele blog não é meu.
Na primeira linha que você ressaltou, a imagem está sendo gravada no disco como um arquivo, do tipo jpg.
BufferedImage é uma classe que representa uma imagem, de qualquer tipo, na memória.
Você pode usar uma JLabel no lugar do JImagePanel. O JImagePanel tem algumas vantagens, como redimensionar a imagem, caso seja muito grande.
A versão oficial dele faz parte do projeto towel:
Quanto ao BD. Primeiro de tudo, você tem que decidir o que você quer.
Se quiser gravar diretamente no banco, use o getBytes como no código do blog.
Se quiser gravar apenas o nome do arquivo, será necessário usar o ImageIO.write para deixar o arquivo em algum lugar, gravar o caminho para esse lugar no banco, e também será necessário usar o ImageIO.read para ler a imagem depois.
Outra possibilidade (não sei se aplicável ao seu software) é só gravar arquivo de imagens, sem o BD, e deixar que o usuário abra esses arquivos depois. Isso seria interessante se você estiver fazendo um editor de imagens.
Dani_Gomes
Ah sim, mais uma vez me equivoquei, mas depois que fui me dar conta que o blog não era seu.
Quanto ao BD, eu vou colocar a imagem dentro do banco.
Só não estou conseguindo fazê-lo. Pois da maneira que eu pensava que inseria, não consegui fazer retornar para um jlabel. Então mudei tudo e agora meu código está assim:
privatebyte[]getCaptura()throwsIOException{
FrameGrabbingControlfgc=(FrameGrabbingControl)player.getControl("javax.media.control.FrameGrabbingControl");javax.media.Bufferbuf=fgc.grabFrame();BufferToImagebtoi=newBufferToImage((VideoFormat)buf.getFormat());Imageimg=btoi.createImage(buf);ByteArrayOutputStreambytesImg=newByteArrayOutputStream();ImageIO.write((BufferedImage)img,"jpg",bytesImg);//Aki eu inseria o local para gravação no disco, no lugar do bytesImg.bytesImg.flush();byte[]byteArray=bytesImg.toByteArray();bytesImg.close();JOptionPane.showMessageDialog(this,"Imagem Capturada com Sucesso!");returnbyteArray;
}
Porém, não está passando nada para gravação no banco, que é do tipo bytea.
Se puderes continuar me ajudando.
Dani_Gomes
ViniGodoy.
Vou seguir minha linha de pensamento, vou tirar a foto com a cam e setar em um diretório qualquer.
Gostaria que você ou alguém do guj, me ajude a pegar este arquivo que está lá no diretório e enviar para o banco, transformando ele em um array de bytes.
Porém sem utilizar o JFilechooser.