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?


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.


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);

3
Intente obtener la ruta SdCard de Environment.getExternalStorageDirectory().toString()y luego intente
Antarix


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.


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);
}

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);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.