Lendo um arquivo de imagem em bitmap do sdcard, por que estou recebendo um NullPointerException?

105

Como posso ler um arquivo de imagem em bitmap do sdcard?

 _path = Environment.getExternalStorageDirectory().getAbsolutePath();  

System.out.println("pathhhhhhhhhhhhhhhhhhhh1111111112222222 " + _path);  
_path= _path + "/" + "flower2.jpg";  
System.out.println("pathhhhhhhhhhhhhhhhhhhh111111111 " + _path);  
Bitmap bitmap = BitmapFactory.decodeFile(_path, options );  

Estou recebendo uma NullPointerException para bitmap. Isso significa que o bitmap é nulo. Mas eu tenho um arquivo de imagem ".jpg" armazenado no sdcard como "flower2.jpg". Qual é o problema?

Smitha
fonte

Respostas:

265

A API MediaStore provavelmente está descartando o canal alfa (ou seja, decodificando para RGB565). Se você tiver um caminho de arquivo, apenas use BitmapFactory diretamente, mas diga a ele para usar um formato que preserve o alfa:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap bitmap = BitmapFactory.decodeFile(photoPath, options);
selected_photo.setImageBitmap(bitmap);

ou

http://mihaifonoage.blogspot.com/2009/09/displaying-images-from-sd-card-in.html

NikhilReddy
fonte
3
o que esta selected_photoaqui?
Autônomo de
Oi! A imagem salva nos álbuns tem 3840x2160, mas a imagem enviada ao servidor por meio desse método é 1080x1920
Shajeel Afzal
@ ParagS.Chandakkar pode ser um ImageView onde você pode exibir o arquivo decodificado.
PinoyCoder
30

Funciona:

Bitmap bitmap = BitmapFactory.decodeFile(filePath);
Ahmad Arslan
fonte
28

Experimente este código:

Bitmap bitmap = null;
File f = new File(_path);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
try {
    bitmap = BitmapFactory.decodeStream(new FileInputStream(f), null, options);
} catch (FileNotFoundException e) {
    e.printStackTrace();
}         
image.setImageBitmap(bitmap);
Jitendra
fonte
6

Escrevi o seguinte código para converter uma imagem de sdcard em uma string codificada em Base64 para enviar como um objeto JSON. E funciona muito bem:

String filepath = "/sdcard/temp.png";
File imagefile = new File(filepath);
FileInputStream fis = null;
try {
    fis = new FileInputStream(imagefile);
    } catch (FileNotFoundException e) {
    e.printStackTrace();
}

Bitmap bm = BitmapFactory.decodeStream(fis);
ByteArrayOutputStream baos = new ByteArrayOutputStream();  
bm.compress(Bitmap.CompressFormat.JPEG, 100 , baos);    
byte[] b = baos.toByteArray(); 
encImage = Base64.encodeToString(b, Base64.DEFAULT);
Priyank Desai
fonte