Erstellen Sie eine Bitmap / Drawable aus dem Dateipfad


82

Ich versuche, eine Bitmap oder ein Drawable aus dem vorhandenen Dateipfad zu erstellen.

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

Aber setImageBitmap(), setImageDrawable()nicht zeigt ein Bild aus dem Weg. Ich habe Pfad mit gedruckt mTextund es sieht aus wie:/storage/sdcard0/DCIM/100LGDSC/CAM00001.jpg

Was mache ich falsch? Kann mir jemand helfen?


BitmapFactory.decodeFile (Pfad) -> Gibt dies ein Bitmap-Objekt für Sie zurück? kannst du es überprüfen?
Toantran

1
@ autobot_101 im Debug-Modus hat es idin mBuffer. Aber sein mHeight, mWidthWert ist -1, und mLayoutBoundsist null.
Nari Kim Shin

Dann sollten Sie Ihren Dateipfad erneut überprüfen, da dies bedeutet, dass Ihr Bild nicht auf das Bitmap-Objekt "aufgeblasen" wurde. Vielleicht können Sie ein anderes Bild versuchen
Toantran

1
@ autobot_101 Eigentlich habe ich diesen Bildpfad von Cursorund habe andere Bilder ausprobiert, aber das gleiche Ergebnis. Außerdem habe ich den Pfad über überprüft adb shellund herausgefunden, dass Bilder in diesem Pfad vorhanden sind.
Nari Kim Shin

Antworten:


138

Erstellen Sie eine Bitmap aus dem Dateipfad:

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

Wenn Sie die Bitmap auf die Höhe und Breite des übergeordneten Elements skalieren möchten, verwenden Sie die Bitmap.createScaledBitmapFunktion.

Ich denke, Sie geben den falschen Dateipfad an. :) Hoffe das hilft.


1
Ich habe meine Lösung bereits vor langer Zeit erhalten, aber ich nehme dies als richtige Antwort, da sie auch OOM-Fehler behandeln kann, während Sie ein großes Bild laden. Sehr saubere und schöne Lösung! Vielen Dank!
Nari Kim Shin

1
Ich nehme an, imageName hier ist eine Zeichenfolge? oder ist es ein bestimmter imageName?
Jeet

@JeetendraChoudhary Ja imageName kann eine beliebige letzte Zeichenfolge als Name des Bildes sein.
CodeShadow

60

Für mich geht das:

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

}

Bearbeiten:

Wenn das oben beschriebene fest codierte SD-Kartenverzeichnis in Ihrem Fall nicht funktioniert, können Sie den SD-Kartenpfad abrufen:

String sdcardPath = Environment.getExternalStorageDirectory().toString();
File imgFile = new  File(sdcardPath);

3
Versuchen Sie, den SdCard-Pfad abzurufen, Environment.getExternalStorageDirectory().toString()und versuchen Sie es dann
Antarix


3

Nun, die Verwendung der Statik Drawable.createFromPath(String pathName)scheint mir ein bisschen einfacher zu sein, als sie selbst zu dekodieren ... :-)

Wenn Ihr mImgein einfaches ist ImageView, brauchen Sie es nicht einmal, verwenden Sie es mImg.setImageUri(Uri uri)direkt.


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
Beachten Sie, dass Sie den Code, den Sie in einer Antwort angeben, erläutern sollten.
Daniel Nugent

0

Sie können nicht über einen Pfad auf Ihre Drawables zugreifen. Wenn Sie also eine lesbare Schnittstelle zu Ihren Drawables wünschen, die Sie programmgesteuert erstellen können.

Deklarieren Sie irgendwo in Ihrer Klasse eine HashMap:

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

Jetzt für den Zugriff -

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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.