Estou trabalhando em uma função para baixar uma imagem de um servidor da Web, exibi-la na tela e, se o usuário desejar manter a imagem, salve-a no cartão SD em uma determinada pasta. Existe uma maneira fácil de pegar um bitmap e salvá-lo no cartão SD em uma pasta de minha escolha?
Meu problema é que posso baixar a imagem e exibi-la na tela como um bitmap. A única maneira que consegui encontrar para salvar uma imagem em uma pasta específica é usar o FileOutputStream, mas isso requer uma matriz de bytes. Não sei como converter (se esse for o caminho certo) de Bitmap para matriz de bytes, para que eu possa usar um FileOutputStream para gravar os dados.
A outra opção que tenho é usar o MediaStore:
MediaStore.Images.Media.insertImage(getContentResolver(), bm,
barcodeNumber + ".jpg Card Image", barcodeNumber + ".jpg Card Image");
O que funciona bem para salvar no cartão SD, mas não permite que você personalize a pasta.
mImage.setImageBitmap(_result.getBitmap());
no meuonTaskComplete()
retorno de chamada. Agora, tenho que permitir que os usuários salvem o arquivo localmente, se quiserem, através do menu de contexto de pressão longa. Eu deveria poder usar a solução abaixo. O que eu quero saber, porém, você descobriu uma abordagem melhor para isso?Respostas:
fonte
90
, no exemplo acima, não terá nenhum efeito ao salvar como PNG, mas fará a diferença para os JPEGs. No caso de um JPEG, você pode escolher qualquer número entre 0 e 100.Você deve usar o
Bitmap.compress()
método para salvar um bitmap como um arquivo. Ele comprimirá (se o formato usado permitir) sua imagem e enviará para um OutputStream.Aqui está um exemplo de uma instância de Bitmap obtida através
getImageBitmap(myurl)
que pode ser compactada como um JPEG com uma taxa de compactação de 85%:fonte
fOut.flush()
não é possível omitir?Bitmap.compress
especifica a qualidade.getImageBitmap(myurl)
lançará uma exceção sem permissão no AndroidManifest.xml (pelo menos no os2.2):
fonte
Dentro
onActivityResult
:fonte
Alguns formatos, como PNG, sem perdas, ignoram a configuração de qualidade.
fonte
Aqui está o código de exemplo para salvar o bitmap no arquivo:
Agora chame esta função para salvar o bitmap na memória interna.
File newfile = savebitmap(bitmap)
;Espero que ajude você. Feliz codificação da vida.
fonte
fonte
Por que não chamar o
Bitmap.compress
método com 100 (que parece sem perdas)?fonte
Eu também gostaria de salvar uma foto. Mas o meu problema (?) É que eu quero salvá-lo de um bitmap que eu desenhei.
Eu fiz assim:
fonte
A maneira que eu encontrei para enviar PNG e transparência.
fonte
Crie uma miniatura de vídeo para um vídeo. Pode retornar nulo se o vídeo estiver corrompido ou o formato não for suportado.
Para salvar seu bitmap em sdcard, use o seguinte código
Imagem da loja
Para obter o caminho para o armazenamento de imagens
fonte
Você deseja salvar o Bitmap no diretório de sua escolha. Criei uma biblioteca ImageWorker que permite ao usuário carregar, salvar e converter imagens bitmaps / drawables / base64.
SDK mínimo - 14
Pré-requisito
Salvando Bitmap / Drawable / Base64
Carregando bitmap
Implementação
Adicionar dependências
No nível do projeto Gradle
No nível do aplicativo Gradle
Você pode ler mais em https://github.com/ihimanshurawat/ImageWorker/blob/master/README.md
fonte
Ei, apenas dê o nome para .bmp
Faça isso:
vai parecer que estou enganando, mas tente uma vez que será salvo no forame bmp ..
fonte
Verifique se o diretório foi criado antes de ligar
bitmap.compress
:fonte
Após o Android 4.4 Kitkat, e a partir de 2017, o compartilhamento do Android 4.4 e menos é de cerca de 20% e diminui, não é possível salvar no cartão SD usando
File
classe egetExternalStorageDirectory()
método. Esse método retorna a memória interna do dispositivo e as imagens são salvas visíveis para todos os aplicativos. Você também pode salvar imagens privadas apenas em seu aplicativo e ser excluído quando o usuário excluir seu aplicativo comopenFileOutput()
métodoA partir do Android 6.0, você pode formatar seu cartão SD como uma memória interna, mas apenas privada para o seu dispositivo. (Se você formatar um carro SD como memória interna, apenas seu dispositivo poderá acessar ou ver seu conteúdo). outras respostas, mas se você quiser usar um cartão SD removível, leia minha resposta abaixo.
Você deve usar o Storage Access Framework para obter o
onActivityResult
método de atividade da interface do usuário para a pasta para obter a pasta selecionada pelo usuário e adicionar permissão persistente de recuperação para poder acessar a pasta depois que o usuário reiniciar o dispositivo.Agora, salve a pasta Salvar nas preferências compartilhadas para não solicitar ao usuário que selecione a pasta toda vez que quiser salvar uma imagem.
Você deve usar a
DocumentFile
classe para salvar sua imagem, nãoFile
ouParcelFileDescriptor
, para obter mais informações, consulte este tópico para salvar a imagem no cartão SD comcompress(CompressFormat.JPEG, 100, out);
método eDocumentFile
classes.fonte
verifique se você adicionou abaixo de Permission
e no AndroidManifest em
simplesmente chame saveBitmapFile (passYourBitmapHere)
Onde
e outros métodos
e
fonte
error handling for PIE devices..
e acho que a recursãogetOutputMediaFile
pode ser um loop infinito se a solução alternativa falhar.Salve o bitmap na sua galeria sem compactar.
fonte
// | == | Crie um arquivo PNG a partir do bitmap:
// | == | Obtenha o Bimap do arquivo:
fonte