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.
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.
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.
“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.”
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.
[code]
public boolean adicionarFoto(String caminho) {
File imgFile = new File(caminho);
BufferedInputStream imagem = new BufferedInputStream(new FileInputStream(imgFile));
addFoto.setBinaryStream(1,imagem, imgFile.length());[/code]
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!!!
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).
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.
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.