Crear un mapa de bits / dibujable a partir de la ruta del archivo

83

Estoy intentando crear un mapa de bits o dibujable a partir de la ruta del archivo existente.

String path = intent.getStringExtra("FilePath");
BitmapFactory.Options option = new BitmapFactory.Options();
option.inPreferredConfig = Bitmap.Config.ARGB_8888;

mImg.setImageBitmap(BitmapFactory.decodeFile(path));
// mImg.setImageBitmap(BitmapFactory.decodeFile(path, option));
// mImg.setImageDrawable(Drawable.createFromPath(path));
mImg.setVisibility(View.VISIBLE);
mText.setText(path);

Sin embargo setImageBitmap(), setImageDrawable()no muestra una imagen de la ruta. He impreso la ruta con mTexty se ve así:/storage/sdcard0/DCIM/100LGDSC/CAM00001.jpg

¿Qué estoy haciendo mal? ¿Alguien puede ayudarme?

Nari Kim Shin
fuente
BitmapFactory.decodeFile (ruta) -> ¿Esto le devuelve un objeto de mapa de bits? ¿puedes verificarlo?
toantran
1
@ autobot_101 en modo de depuración, tiene idin mBuffer. Sin embargo, su mHeight, mWidthvalor es -1, y mLayoutBoundses null.
Nari Kim Shin
Luego, debe verificar la ruta de su archivo nuevamente, porque eso significa que su imagen no se ha 'inflado' al objeto de mapa de bits. Quizás puedas probar con otra imagen
toantran
1
@ autobot_101 en realidad obtuve esta ruta de imagen Cursory probé otras imágenes, pero el mismo resultado. Además, verifiqué la ruta a través adb shelly descubrí que existen imágenes en esa ruta.
Nari Kim Shin

Respuestas:

140

Crear mapa de bits a partir de la ruta del archivo:

File sd = Environment.getExternalStorageDirectory();
File image = new File(sd+filePath, imageName);
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
Bitmap bitmap = BitmapFactory.decodeFile(image.getAbsolutePath(),bmOptions);
bitmap = Bitmap.createScaledBitmap(bitmap,parent.getWidth(),parent.getHeight(),true);
imageView.setImageBitmap(bitmap);

Si desea escalar el mapa de bits a la altura y el ancho del padre, use la Bitmap.createScaledBitmapfunción.

Creo que está dando la ruta de archivo incorrecta. :) Espero que esto ayude.

CodeShadow
fuente
1
Ya obtuve mi solución hace mucho tiempo, pero lo tomaré como una respuesta correcta porque también puede manejar errores OOM mientras carga una imagen a gran escala. Solución muy limpia y agradable! ¡Gracias!
Nari Kim Shin
1
¿Supongo que imageName aquí es alguna cadena? o es un nombre de imagen específico?
Jeet
@JeetendraChoudhary Sí imageName podría ser cualquier String final como el nombre de la imagen.
CodeShadow
61

Esto funciona para mi:

File imgFile = new  File("/sdcard/Images/test_image.jpg");
if(imgFile.exists()){
    Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
    //Drawable d = new BitmapDrawable(getResources(), myBitmap);
    ImageView myImage = (ImageView) findViewById(R.id.imageviewTest);
    myImage.setImageBitmap(myBitmap);

}

Editar:

Si el directorio sdcard codificado anteriormente no funciona en su caso, puede buscar la ruta de la sdcard:

String sdcardPath = Environment.getExternalStorageDirectory().toString();
File imgFile = new  File(sdcardPath);
Kaidul
fuente
3
Intente obtener la ruta SdCard de Environment.getExternalStorageDirectory().toString()y luego intente
Antarix
40

aquí hay una solución:

Bitmap bitmap = BitmapFactory.decodeFile(filePath);
techtinkerer
fuente
¡Lo estaba buscando!
Abner Escócio
3

Bueno, usar la estática me Drawable.createFromPath(String pathName)parece un poco más sencillo que decodificarla usted mismo ... :-)

Si tu mImges simple ImageView, ni siquiera lo necesitas, úsalo mImg.setImageUri(Uri uri)directamente.

Gábor
fuente
1
static ArrayList< Drawable>  d;
d = new ArrayList<Drawable>();
for(int i=0;i<MainActivity.FilePathStrings1.size();i++) {
  myDrawable =  Drawable.createFromPath(MainActivity.FilePathStrings1.get(i));
  d.add(myDrawable);
}
Sanjay Patel
fuente
4
Tenga en cuenta que debe explicar el código que proporciona en una respuesta.
Daniel Nugent
0

no puede acceder a sus elementos de diseño a través de una ruta, por lo que si desea una interfaz legible por humanos con sus elementos de diseño que pueda construir mediante programación.

declare un HashMap en algún lugar de su clase:

private static HashMap<String, Integer> images = null;

//Then initialize it in your constructor:

public myClass() {
  if (images == null) {
    images = new HashMap<String, Integer>();
    images.put("Human1Arm", R.drawable.human_one_arm);
    // for all your images - don't worry, this is really fast and will only happen once
  }
}

Ahora para acceder -

String drawable = "wrench";
// fill in this value however you want, but in the end you want Human1Arm etc
// access is fast and easy:
Bitmap wrench = BitmapFactory.decodeResource(getResources(), images.get(drawable));
canvas.drawColor(Color .BLACK);
Log.d("OLOLOLO",Integer.toString(wrench.getHeight()));
canvas.drawBitmap(wrench, left, top, null);
Suresh Parmar
fuente