Transformar campo "Blob" em Imagem

Bom estou precisando pegar uma imagem (Blob ou Oid) que esta no BD (Postgre) e transforma-la em Image ou Inputstream para coloca-la em um relatorio feito com JasperReports.

Ja procurei, mas ainda não encotrei algo que funcione corretamente.

Utilizei a forma logo abaixo:

http://www.guj.com.br/posts/list/78656.java

e depois peguei o array de Bytes e passo no construtor do ImageIcon, mas não aparece a m… da imagem.

Alguem ai teria um solução facil e funcional…

Grato a todos.

:?: :arrow: :idea:

Bom eu fiz algo parecido, mas armazenei a imagem num array de bytes do banco e funcionou…
Seguindo os passos…

  1. quando armazenar a imagem, tranforme ela num array de bytes e armazene no banco

2)quando vai ler ela, pegue o array de bytes do banco, transforme num File e grave num arquivo temporário com o nome e extensão da imagem

3)Abra a imagem do arquivo temporário e a utilize conforme sua necessidade… no seu caso no relatório…

Dessa maneira pra mim funcionou…

Tem um link aqui que diz como fazer isso… Só que é usando o hibernate… mas a idéia de armazenar é seguindo esses passos que citei acima.
http://www.infoblogs.com.br/view.action?contentId=23302&Bytea+PostgreeSQL+Hibernate+Persistindo+pequenas+imagens+em+um+BD
Existem outras maneiras, mas esta é uma das várias…

Estou com o mesmo problema, preciso listar as figuras de uma tabela no banco de dados, criar arquivos temporarios no banco acho que não é o melhor caminho, deve existir alguma forma de trazer esses dados direto no ireport.

tentei o exemplo http://ireport-tutorial.blogspot.com/2008/11/show-blob-image-in-ireport.html porem não se aplica ao tipo OID do postgresql.

No relatorio coloquei um parametro do Tipo Inputstream e passei este parametro para a imagem que tambem é do tipo Inputstream.

Mas esta ocorrendo um erro na hora de pegar o inputstream do Blob…

 private Inputstream getLogoEmpresa() { 
    String sql = "select logo_empresa from empresa where id = 1";
    Inputstream logo = null;
  

    Connection conn = ConnectionFactory.getConnection();
    conn.setAutoCommit(false);
    PreparedStatement p = conn.prepareStatement(sql);
    ResultSet result = p.executeQuery();

    while(result.next()) {
 	 Blob blob = result.getBlob("logo_empresa");
         logo = blob.getBinaryStream(); // Aqui acontece o erro
    }

    return logo;
}

Erro:

Error loading byte data from input stream. - Causa: java.io.IOException: org.postgresql.util.PSQLException: Um erro de E/S ocorreu ao enviar para o processo servidor.

Consegui finalmente pegar um Blob (OID Postgre) e transforma-lo em inputstream para utilizar no meu relatorio.

Codigo abaixo:

 Blob blob = result.getBlob("logo_empresa");  
 byte[] bin = blob.getBytes(1, (int) blob.length());
 ByteArrayInputStream stream = new ByteArrayInputStream(bin);

:smiley: