Utwórz mapę bitową / do rysowania ze ścieżki pliku

84

Próbuję utworzyć mapę bitową lub do rysowania z istniejącej ścieżki pliku.

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

Ale setImageBitmap(), setImageDrawable()nie wyświetla obrazu z toru. Wydrukowałem ścieżkę za pomocą mTexti wygląda to tak:/storage/sdcard0/DCIM/100LGDSC/CAM00001.jpg

Co ja robię źle? Czy ktoś może mi pomóc?

Nari Kim Shin
źródło
BitmapFactory.decodeFile (ścieżka) -> czy to zwraca obiekt Bitmap? czy możesz to zweryfikować?
toantran
1
@ autobot_101 w trybie debugowania, ma idw mBuffer. Ale jego mHeight, mWidthwartość jest -1, a mLayoutBoundsjest null.
Nari Kim Shin
Następnie należy ponownie sprawdzić ścieżkę do pliku, ponieważ oznacza to, że obraz nie został „zawyżony” do obiektu bitmapy. Może spróbuj innego obrazu
toantran
1
@ autobot_101 faktycznie mam tę ścieżkę obrazu z Cursori próbowałem innych obrazów, ale ten sam wynik. Sprawdziłem również ścieżkę przez adb shelli odkryłem, że obrazy istnieją w tej ścieżce.
Nari Kim Shin

Odpowiedzi:

142

Utwórz bitmapę ze ścieżki pliku:

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

Jeśli chcesz przeskalować bitmapę do wysokości i szerokości rodzica, użyj Bitmap.createScaledBitmapfunkcji function.

Myślę, że podajesz złą ścieżkę do pliku. :) Mam nadzieję że to pomoże.

CodeShadow
źródło
1
Mam już swoje rozwiązanie dawno temu, ale potraktuję to jako poprawną odpowiedź, ponieważ może również obsługiwać błędy OOM podczas ładowania obrazu w dużej skali. Bardzo czyste i ładne rozwiązanie! Dzięki!
Nari Kim Shin
1
Zakładam, że imageName jest tutaj dowolnym ciągiem? czy jest to jakiś konkretny imageName?
Jeet
@JeetendraChoudhary Tak imageName może być dowolnym końcowym ciągiem znaków jako nazwą obrazu.
CodeShadow,
62

Mi to pasuje:

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

}

Edytować:

Jeśli powyższy katalog sdcard na stałe nie działa w Twoim przypadku, możesz pobrać ścieżkę sdcard:

String sdcardPath = Environment.getExternalStorageDirectory().toString();
File imgFile = new  File(sdcardPath);
Kaidul
źródło
3
Spróbuj pobrać ścieżkę do karty SdCard, Environment.getExternalStorageDirectory().toString()a następnie spróbuj
Antarix,
40

tutaj jest rozwiązanie:

Bitmap bitmap = BitmapFactory.decodeFile(filePath);
techtinkerer
źródło
Szukałem tego!
Abner Escócio
3

Cóż, użycie statycznego Drawable.createFromPath(String pathName)wydaje mi się nieco prostsze niż samodzielne dekodowanie ... :-)

Jeśli twój mImgjest prosty ImageView, nawet go nie potrzebujesz, użyj mImg.setImageUri(Uri uri)bezpośrednio.

Gábor
źródło
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
źródło
4
Pamiętaj, że powinieneś wyjaśnić kod, który podajesz w odpowiedzi.
Daniel Nugent,
0

nie możesz uzyskać dostępu do swoich drawables przez ścieżkę, więc jeśli chcesz mieć czytelny dla człowieka interfejs z twoimi drawables, który możesz budować programowo.

zadeklaruj HashMap gdzieś w swojej klasie:

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

Teraz dostęp -

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
źródło