Problemas com a conversão de Bitmap para byte[]

8 respostas
R4izen

Estou convertendo Bitmap para byte[] desta forma

ByteArrayOutputStream bos = new ByteArrayOutputStream();  
                    
                    bitmap.compress(CompressFormat.PNG, 100 , bos); 
                    byte[] imgByte = bos.toByteArray();

Estou armazenando no banco o byte[], mas quando pego a imagem do banco e faço ela ser exibida no aparelho, ela é mostrada no canto em um tamanho bem menor do que quando foi tirada.

Fiz testes armazenando no banco uma imagem do computador e funcionou, é exibida normal no aparelho, mas as tiradas com o dispositivo e convertidas para byte[] ficam pequenas.

8 Respostas

Marky.Vasconcelos

Voce tem certeza que as imagens tiradas são grandes?

R4izen

Verifiquei e as imagens estão grandes.

Resolvi testar sem enviar para o banco.
Fiz a conversão para byte[] e depois converti para Bitmap novamente e setei em um ImageView, mas continua aparecendo pequena

Intent intent; intent = getIntent(); byte[] bt = intent.getByteArrayExtra("byteImg"); Bitmap imagBitmap = BitmapFactory.decodeByteArray(bt,0,bt.length); ImgeView imgV = (ImageView) findViewById(R.id.exibeImg); imgV.setImageBitmap(imgBitmap);

R4izen

mudei o ImageView para “fill_parent”, esta mostrando na tela toda, mas com em uma qualidade menor do que quando foi tirada.

Marky.Vasconcelos

Como voce tira essa foto?

R4izen

Chamo a camera

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            	startActivityForResult(intent, TIRAR_FOTO);

Depois de capturar a foto ja converto para byte[]

if (requestCode == TIRAR_FOTO) {
            if (resultCode == RESULT_OK) {
                    Bitmap bitmap = (Bitmap) data.getExtras().get("data");
                    
                    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
                    bitmap.compress(CompressFormat.PNG, 100 , bos); 
                    byte[] imgByte = bos.toByteArray();

A imagem esta sendo salva na galeria do celular com a qualidade boa.

Marky.Vasconcelos

Voce tem certeza que bitmap.getWidth() e bitmap.getHeight() retornam um valor maior do que antes de grava-lo?

Segundo, se voce quer só pegar o byte[] da imagem voce pode fazer o seguinte:

Bitmap bmp = //sua imagem
        ByteBuffer buffer = ByteBuffer.allocate(bmp.getWidth() * bmp.getHeight() * 4);//4 para ARGB e 3 para RGB
        bmp.copyPixelsToBuffer(buffer);
R4izen

Então Marky.Vasconcelos,
coloquei esta linha para ver a resolução logo após capturar a imagem com a camera.

Bitmap bitmap = (Bitmap) data.getExtras().get("data"); Toast.makeText(getApplicationContext(),bitmap.getHeight()+" , "+bitmap.getWidth(),Toast.LENGTH_LONG).show();

Realmente esta pegando a imagem em resolução baixa. Esta com 160 x 120 e a camera esta configurada para tirar em 2560x1920.
Não entendo o motivo, pois a camera esta configurada com a maior resolução e a imagem esta sendo salva na galeria com a resolução alta.

E

Cara já tive esse problema também, sempre que o programa da camera é chamado de dentro da minha aplicação não sei porq ele assume outra resolução, e por ali não conseguimos acessar as configurações da cam, tenho um milestone 2 não sei se tem algo haver.

O que pode ser feito é passar um parametro onde gere uma cópia da imagem para vc, e após isso vc lê para seu byte[] e depois apaga a imagem temporaria.

uriImageCapture = Uri.fromFile(fileImageTmp);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uriImageCapture);
startActivityForResult(intent, CAPTURE_IMAGE);

Espero que ajude :wink:

abs,

Evandro

Criado 5 de dezembro de 2011
Ultima resposta 6 de dez. de 2011
Respostas 8
Participantes 3