Perda de Qualidade da imagem ao Recuperar Da Base de Dados

Alo Pessoal, estou com o seguinte Problema

Estou gravando uma Imagem no banco de dados MySQL, mas o problema é que quando recupero a imagem no Banco, ela perde qualidade (Acabei por ver que a falta de qualidade so se nota em programas como Picasa, Windows Fax and photo, etc) no Broswer nao se nota

Aqui estão o metodo que uso para inserir a imagem no Banco de dados

public void gravarimagem(File imagem) throws FileNotFoundException, SQLException{ FileInputStream foto = new FileInputStream(imagem); String sql = "insert into tabela values(NULL,?)"; PreparedStatement stmt = this.conexao.prepareStatement(sql); stmt.setBinaryStream(1, foto, imagem.length()); stmt.execute(); }

e para Ler a imagem do Banco aqui esta o codigo:

public InputStream LerImagem() throws SQLException{ String sql = "Select * from tabela"; PreparedStatement stmt = this.conexao.prepareStatement(sql); ResultSet rs = stmt.executeQuery(); Blob a = null; while(rs.next()){ a = rs.getBlob("foto"); } return a.getBinaryStream(); }

Na classe de testes uso o seguinte codigo, para fazer o teste:

public static void main(String[] args) throws SQLException, ClassNotFoundException, FileNotFoundException, IOException { consultas consultas = new consultas(); InputStream a = consultas.LerImagem(); if (a != null) { ByteArrayOutputStream output = new ByteArrayOutputStream(); byte[] rb = new byte[1024]; int ch = 0; while ((ch = a.read(rb)) != -1) { output.write(rb, 0, ch); } byte[] b = output.toByteArray(); output.close(); output.close(); Image c = new ImageIcon(b).getImage(); if (c == null) { return; } BufferedImage img = new BufferedImage(c.getWidth(null), c.getHeight(null), BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = img.createGraphics(); g2d.drawImage(c, 0, 0, null); g2d.dispose(); ImageIO.write(img, "JPG", new File("imagem.jpg")); } }

Agora, vejam a diferença entre a Imagem que insiro, e a imagem que recupero




    String sql = "Select * from tabela";  
    PreparedStatement stmt = this.conexao.prepareStatement(sql);  
    ResultSet rs = stmt.executeQuery();  
    Blob a = null;  
    while(rs.next()){  
       a = rs.getBlob("foto");   
    }  

Hum… o que ocorre se você tiver N linhas nessa tabela? O seu código é muito ingênuo (supõe que a tabela tem exatamente uma linha). Se houver 0 linhas ou se houver mais de uma linha, os resultados não serão os esperados. Em particular, digamos que sua tabela tenha 2 linhas, a primeira linha seja a imagem de 57K e a segunda seja a imagem de 37K. O que vai ocorrer?
(Se a tabela estiver vazia, vai provocar um NullPointerException :frowning: )

[quote=bezier curve] String sql = "Select * from tabela"; PreparedStatement stmt = this.conexao.prepareStatement(sql); ResultSet rs = stmt.executeQuery(); Blob a = null; while(rs.next()){ a = rs.getBlob("foto"); }
Hum… o que ocorre se você tiver N linhas nessa tabela? O seu código é muito ingênuo (supõe que a tabela tem exatamente uma linha). Se houver 0 linhas ou se houver mais de uma linha, os resultados não serão os esperados. Em particular, digamos que sua tabela tenha 2 linhas, a primeira linha seja a imagem de 57K e a segunda seja a imagem de 37K. O que vai ocorrer?
(Se a tabela estiver vazia, vai provocar um NullPointerException :frowning: )[/quote]

Nesta Fase so estava a escrever um codigo rapido para poder testar se é possivel ir guardar uma imagem no banco de dados e se era possivel ir buscar imagens, fiz o codigo dessa forma pois meu banco so tem uma tabela com 1 so linha. Esse codigo ai é mesmo so para teste

Minha real preocupação é a PERDA DE QUALIDADE NA FOTO

Na verdade não consegui entender como é que a foto ainda carregou. Dá a impressão que a foto foi truncada no banco, isso sim.

Faça uma experiência: limpe essa base, e tente carregar uma foto bem maior (uns 5MB). Depois, tente recuperá-la. Se o tamanho resultante continuar a ser de cerca de 37 KB, está havendo um truncamento na hora ou de gravar ou de recuperar a foto do banco.

Como o banco de dados não tem a menor idéia de que o conjunto de dados que você está gravando nele é uma foto, ele não vai “perder a qualidade” por conta própria. O que ele pode fazer é truncar seus dados se você não declarou corretamente o tipo da coluna na tabela.

[quote=bezier curve]Na verdade não consegui entender como é que a foto ainda carregou. Dá a impressão que a foto foi truncada no banco, isso sim.

Faça uma experiência: limpe essa base, e tente carregar uma foto bem maior (uns 5MB). Depois, tente recuperá-la. Se o tamanho resultante continuar a ser de cerca de 37 KB, está havendo um truncamento na hora ou de gravar ou de recuperar a foto do banco.

Como o banco de dados não tem a menor idéia de que o conjunto de dados que você está gravando nele é uma foto, ele não vai “perder a qualidade” por conta própria. O que ele pode fazer é truncar seus dados se você não declarou corretamente o tipo da coluna na tabela. [/quote]

Acho que o problema é na Hora de recuperar… pois o tamanho do BLOB que esta no banco é igual ao do ficheiro Original (Tentei com foto maior), mas o ficheiro recuperado tem tamanho menor