Como trabalhar com grande bitmap. Rotação e inserindo para a galeria

votos
5

Eu preciso tirar uma foto com a câmera e, se dependendo do tamanho da imagem, girá-lo antes de o guardar para a galeria.

estou a usar

Intenção imageCaptureIntent = novo intenção (MediaStore.ACTION_IMAGE_CAPTURE); imageCaptureIntent.putExtra (MediaStore.EXTRA_OUTPUT, uri); startActivityForResult (imageCaptureIntent, IMAGE_CAPTURE);

Para tirar a foto e salve-o em um arquivo temporário.

Então

Bmp = bitmap BitmapFactory.decodeFile (imagepath);
Corda str = android.provider.MediaStore.Images.Media.insertImage (cr, BMP, nome, descrição);

Para salvá-lo.

Este é o código que eu tentei usar para girar o bitmap

Matriz = matriz nova matriz ();
matrix.postRotate (180);
Bitmap x = Bitmap.createBitmap (BMP, 0, 0, bmp.getWidth (), bmp.getHeight (), matriz, verdadeiro);
android.provider.MediaStore.Images.Media.insertImage (cr, x, nome, descrição);

O problema é que eu estou recebendo um OutOfMemoryException.

Existe uma maneira melhor de lidar com os bitmaps para evitar quebrar a memória?

~ Obrigado antecipadamente, considera

Publicado 19/02/2010 em 23:19
fonte usuário
Em outras línguas...                            


2 respostas

votos
2

Eu não acho que há uma maneira melhor de lidar com bitmaps. Você poderia tentar analisar dados diretamente de um arquivo como Byte [] uma parte de cada vez, e manipulando-o em pedaços; é difícil e você provavelmente vai acabar com um código muito feio.

Também sugiro o seguinte:

  • Use android.provider.MediaStore.Images.Media.insertImage(cr, imagePath, name, description)em vez de android.provider.MediaStore.Images.Media.insertImage(cr, bmp, name, description)esta forma, não há necessidade de chamar Bitmap bmp = BitmapFactory.decodeFile(imagePath)e nenhum bitmap será carregado na memória nesse ponto.

  • Ao longo de seu código, certifique-se nenhum bitmap é carregado a menos que necessário. Definir bitmaps que não são mais necessários para nulle chamar o coletor de lixo, ou o uso bmp.recycle().

Respondeu 18/11/2010 em 19:48
fonte usuário

votos
0

Eu tive o mesmo problema com rotação de bitmap. O problema aqui:

    Bitmap bmp = BitmapFactory.decodeFile(imagePath); //this is the image you want to rotate
    // keeping in mind that you want to rotate the whole original image instead
    // of its downscaled copy you cant use BitmapFactory downscaling ratio
    Matrix matrix = new Matrix();
    matrix.postRotate(180);
    Bitmap x = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true); 
    // the line above creates another bitmap so we have here 2 same sized bitmaps
    // even using the same var (bmp instead of x) wont change anything here
    // so you gonna get the OOM here

é que ele cria 2 bitmaps assim que querem x2 mais memória RAM.
Verifique minha pergunta e solução aqui . Aposto para ImageMagick lib.

Respondeu 16/02/2015 em 07:12
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more