Acontece que o array de byte gravado é só o DataBuffer da imagem (seu conteúdo). O construtor de ImageIcon só aceita um array de byte de todo o arquivo (incluindo informações sobre seu formato).
Para criar um Image, você precisará fazer exatamente o processo contrário da gravação:
Crie um DataBufferByte a partir do array lido do banco.
Crie um SampleModel (o tipo específico dependerá da sua necessidade).
Crie um Raster (Raster.createRaster) a partir desses dois objetos que você criou anteriormente.
Crie um BufferedImage com a altura e largura apropriados (a partir das dimensões do Raster).
Defina o Raster do BufferedImage como sendo aquele que você criou (BufferedImage.setData).
Crie um ImageIcon a partir do BufferedImage.
Ufa! Perceba que nesse procedimento você vai do nível mais baixo (array de bytes) até o mais alto (um componente que exibe a imagem renderizada), que é justamente o oposto do que você vez ao gravar a imagem no banco.
neto.jpa
Tentei desta maneira:
if(foto!=null){
BufferedImageimg=null;try{
img=ImageIO.read(newByteArrayInputStream(foto));SampleModela=img.getSampleModel();Rasterraster=Raster.createRaster(a,img.getData().getDataBuffer(),null);BufferedImagebuffer=null;buffer=buffer.getSubimage(raster.getMinX(),raster.getMinY(),raster.getWidth(),raster.getHeight());buffer.setData(raster);this.jLabelFoto.setIcon(newImageIcon(buffer));}catch(IOExceptione){
JOptionPane.showMessageDialog(null,"Erro ao converter o vetor "+"de Bytes[] em BufferedImage"+e.getMessage());e.printStackTrace();}
Deu erro na criação do SampleModel, alguma dica?
M
marcobiscaro2112
Assim como o construtor de ImageIcon, o ImageIO.read só funciona corretamente se o conteúdo do InputStream for uma imagem em um formato específico (não basta passar o bytes somente da imagem - um mapa de bits, no caso de imagens bitmap).
Tente seguir o procedimento que eu te informei acima.
neto.jpa
Marcos tem como vc me dar um exemplo para criar um SampleModel (ou algum link, tutorial, etc). A extensão da imagem não importa pra mim, a única utilização será pra vizualizar na aplicação.
Agradeço pela ajuda desde já!
M
marcobiscaro2112
Segundo a documentação da classe SampleModel:
“All image data is expressed as a collection of pixels. Each pixel consists of a number of samples. A sample is a datum for one band of an image and a band consists of all samples of a particular type in an image. For example, a pixel might contain three samples representing its red, green and blue components.”
Procure por subclasses concretas de SampleModel.
neto.jpa
Afff to aqui ainda cara tentando mais ainda não consegui…
ViniGodoy
Você deve criar um Input ou um Output stream no banco. E usar o método ImageIO.write ou ImageIO.read sobre ele. Não esqueça de criar uma coluna para gravar o nome do formato de arquivo também.
Dificilmente você vai trabalhar com o array d ebytes diretamente. Não é prático, nem rápido, nem inteligente.
public boolean adicionarFoto(String caminho) {
File imgFile = new File(caminho);
BufferedInputStream imagem = new BufferedInputStream(new FileInputStream(imgFile));
addFoto.setBinaryStream(1,imagem, imgFile.length());
Já pedi ajuda aos meus colegas e professores da faculdade, mas eles salvam a imagem em um arquivo temporário.
Estava precisando consertar isso hoje, pois amanhã meus professores pediram pra mostrar meu projeto de biometria para os alunos novatos da faculdade!!!
Grato!!!
neto.jpa
Aee galera consegui vou ajeitar o código e postar ae. Com certeza vai servir pra muita gente.
Ué… se você já sabe que classe usar, é só usá-la. Crie um BufferedInputStream passando o array de bytes para o construtor de depois leia a imagem com ImageIO (passando o BufferedInputStream criado).
neto.jpa
Pois é cara tava dando maior desastre aqui ao fazer isso. Tem coisas que não da pra explicar ex:
public static void main(String[] args) {
JOptionPane.showMessageDialog(null, "dfdf", "qw", JOptionPane.OK_OPTION);
JOptionPane.showMessageDialog(null, "dfdf", "qw", JOptionPane.INFORMATION_MESSAGE);
JOptionPane.showMessageDialog(null, "dfdf", "qw", JOptionPane.ERROR_MESSAGE);
}
Logo vai perceber que as imagens retornadas estão todas erradas.
“Coisas simples as vezes se tornam difíceis!”
neto.jpa
Já dei um jeito no que eu queria: a classe que tem o atributo foto coloquei como Object, logo apos criei uma classe pra manipular e fazer as criações de imagem de acordo com o dado passado (BufferedInputStream e byte[]).
Quero aqui agradecer ao Marcos e ao ViniGodoy pela ajuda, espero poder ajudar muita gente aqui no guj tambem.