De BLOB para Bitmap e vice-versa

Preciso armazenar uma imagem no banco de dados e, seguindo alguns exemplos, implementei o codigo para pegar do banco e armazenar como Bitmap:

ByteArrayInputStream inputStream = new ByteArrayInputStream(c.getBlob(3)); Bitmap foto = BitmapFactory.decodeStream(inputStream);

As minhas perguntas são:

1- Será que isso vai funcionar?
2- Como eu faço o inverso e passo de Bitmap para Blob para mandar pro ContentValues?

Desde já eu agradeço.

Você pode usar o Bitmap.compress para transformar sua imagem em um byte array.

Desculpa a noobisse Marky mas eu realmente não conheço Java/Android tão afundo assim. Eu fui no developer.android mas não entendi muito bem o código do método. Poderia me dar o código exemplificado?

Voce pode:

ByteArrayOutputStream stream = new ByteArrayOutputsTream(byteArrayVazio);
Bitemap.compress(Bitmap.CompressFormat.PNG, 100, stream);

Dai seu byteArrayVazio vai ter os bytes da imagem.

public ContentValues getContentValues(){ ContentValues valores = new ContentValues(); valores.put("nome", nome); valores.put("idade", idade); ByteArrayOutputStream streamfoto = new ByteArrayOutputStream(); foto.compress(Bitmap.CompressFormat.PNG, 100, streamfoto); valores.put("foto", streamfoto.toByteArray()); valores.put("urlfacebook", urlfacebook); valores.put("relacionamento", relacionamento); valores.put("musica", musica); valores.put("livro", livro); valores.put("profissao", profissao); valores.put("programatv", programatv); return valores; }

É isso?

Não sei, funcionou?

Escrevi de cabeça o que lembro como escrever uma imagem numa stream.

Não deu pra testar ainda mas eu posto a resposta.

Vi que ainda não encerraram este tópico, então não quis replicar minha dúvida.

Meu problema é apenas em ler um arquivo Blob e transformá-lo novamente em imagem para exibir no meu App. A inserção será feita em um servidor e não é importante para mim. O problema é que eu pego o array de bytes do Blob e tento decodificar para um Bitmap, mas quando vou usá-lo vejo que está nulo.

Faço da seguinte forma:

public static ImageView converterBlobParaImagem(Context c, byte[] bytes) {
        
    try { // Tenta converter o blob em uma imagem

        BitmapFactory.Options options = new BitmapFactory.Options();
    	options.inPreferredConfig = Bitmap.Config.ARGB_8888;
        // 'bytes' é o Blob que vem do banco, está vindo preenchido corretamente
    	Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options);
    		
    	ImageView img = new ImageView(c);
    	img.setImageBitmap(bmp); // Verifiquei que este 'bmp' está nulo...
    		
        return img; // retorna a imagem
    } catch (Exception e) {
        info("Erro ao converter o arquivo binário para imagem. " + e.getLocalizedMessage());
        return new ImageView(c); // Retorna a imagem do jeito que está
    } // Fim do controle try/catch
        
} // Fim do método converterBlobParaImagem

O array de byte é o Blob que eu pego do banco de dados, levando em consideração que podem ser uma imagem em JPG, PNG ou BMP.

Por que ele não consegue decodificar? É algo relacionado ao “options” ali, não é? Verifiquei os bytes e eles estão preenchidos, ou seja, está realmente retornando do banco, só não consigo transformar.

Ainda sou iniciante em Android e gostaria de aprender como ele trata essa imagem vinda de um campo Blob e como eu posso manipulá-la.

seguinte, cara…

editei em cima do código que vc fez, e não testei… mas acho que vai funcionar… faz assim:

public static ImageView converterBlobParaImagem(Context c, byte[] bytes) {

try { // Tenta converter o blob em uma imagem  
    //alimenta a imageStream com o que tem no bytes
ByteArrayInputStream imageStream = new ByteArrayInputStream(bytes);
   
   //seta no bmp o stream carregado na linha de cima
   Bitmap bmp = BitmapFactory.decodeStream(imageStream);
          
    ImageView img = new ImageView(c);  
    img.setImageBitmap(bmp); // aqui seta a imagem no imageview
          
    return img; // retorna a imagem  
} catch (Exception e) {  
    info("Erro ao converter o arquivo binário para imagem. " + e.getLocalizedMessage());  
    return new ImageView(c); // Retorna a imagem do jeito que está  
} // Fim do controle try/catch  

} // Fim do método converterBlobParaImagem

--------------EDIT

só uma dica… cuidado com o tamanho das fotos, pois tive problemas com o galaxy Y, quando a foto era muito grande, a memoria estourava, daí ele travava e dava erro no aplicativo…

Saryoromulo, obrigado por ter respondido.

Eu já tinha tentado com stream e o erro que tinha dado é o mesmo, o método não está conseguindo decodificar o meu array de bytes. Talvez o problema seja o array, mas eu não acredito muito nisso não.

Enfim, eu continuei a pesquisar e o pessoal é quase sempre unânime nesse assunto, dizendo que realmente NÃO VALE A PENA armazenar uma imagem em Blob. Por diversos fatores, dentre eles, inclusive, desempenho, o que é capital tratando-se de dispositivos móveis.

Por causa disso acabei mudando meu sistema e estou armazenando só o nome da imagem para recuperá-la em um diretório depois. Para quem está em dúvida, aconselho o mesmo…

Mesmo assim obrigado pela ajuda.

legal, o importante é fazer funcionar!

Mas no meu programa eu consegui funcionar de um jeito parecido aí como te enviei… no meu caso, compensa muito gravar a imagem em um blob no sqlite, por causa da sincronização que faço com meu servidor, do uso desses registros depois, e td mais… fica muito mais organizado, e acredite, o desempenho não ficou ruim igual dizem por aí não.
Eu particularmente acho que é muito mais organizado deixar as fotos num banco de dados, do que em uma pasta cheia de arquivos com nomes diferentes… porém, no meu caso, eu diminuo a qualidade da imagem antes de salvar no sqlite, daí ela nao fica com um tamanho grande, e dá pra fazer tudo com um desempenho bom… se fossem imagens de qualidade alta, aí não compensaria mesmo.

Exatamente! O que está nos preocupando é a parte de sincronização. Ao invés de um só arquivo de banco de dados, agora a gente vai ter que puxar os diretórios e vários arquivos diferentes para atualizar o sistema.

Não chega a ser uma crise, mas o desempenho desse processo seria mais rápido. Por questões de prazo, vamos fazer guardando apenas o endereço, mas mais para frente quero testar de novo armazenando em Blob, nem que seja só para comparar o desempenho.

Mais uma vez obrigado pela resposta.

Certo, entendo que vc vai fazer desse outro jeito então… Mas como bom teimoso que sou, vou insistir…

testa do jeito que eu passei ali, pq realmente, no meu funciona!

mais exatamente, a parte que carrega o blob de um cursor no meu projeto está assim:

byte[] imageByteArray = cursor2.getBlob(6);
ByteArrayInputStream imageStream = new ByteArrayInputStream(imageByteArray);
Bitmap theImage = BitmapFactory.decodeStream(imageStream);
iv.setImageBitmap(theImage);

acho estranho vc desistir facil assim, pq transformar de blob pra bitmap é o mais simples… o que eu apanhei foi pra pegar a foto da camera e passar pra blob… heheh

mas enfim… testa aí aquele codigo que passei na resposta anterior, e ve qual é o erro que dá…
dá uma olhada se realmente o parametro byte[] lá tá passando certinho

só uma observação… a imagem que eu salvo e recupero aqui no meu banco é .jpeg sempre… daí nao sei se pode dar algum problema se for algum outro formato, como .bmp, e etc…

Hehehe, eu te entendo, Saryoromulo. Não é que eu tenha desistido fácil. Eu testei a sua solução e o erro foi o mesmo, “decodification null” ou algo assim. Pesquisei em tutoriais, fóruns estrangeiros e guias antes de postar aqui, mas nada funcionou. O que me leva a crer que o problema pode ser o meu array de bytes. Nós ainda não desenvolvemos a aplicação servidora então estou usando um programa para gerar os dados em SQLite. Acredito que ao passar a imagem ele joga algum lixo ali, não sei, é algo difícil de identificar.

Quando eu tiver a aplicação servidora vai ser mais fácil de manipular e aí sim vou testar de novo, ok? No momento temos que cumprir certos prazos, mas como desempenho é nossa prioridade nós não descartamos usar Blob, apenas deixamos em, digamos, “stand by”.

Obrigado por toda ajuda e pela opinião sincera.