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.
N
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.
N
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.
N
neto.jpa
Afff to aqui ainda cara tentando mais ainda não consegui…
V
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!!!
N
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).
N
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!”
N
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.