2013-05-29 12 views
51

Próbuję utworzyć mapę bitową lub ścieżkę do rysowania z istniejącej ścieżki do pliku.Utwórz mapę bitową/ścieżkę do rysowania ze ś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 pokazuje obraz ze ścieżki. Wydrukowałem ścieżkę z mText i wygląda to następująco: /storage/sdcard0/DCIM/100LGDSC/CAM00001.jpg

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

+0

BitmapFactory.decodeFile (ścieżka) -> czy to zwrócenie obiektu Bitmap dla Ciebie? możesz to zweryfikować? – toantran

+1

@ autobot_101 w trybie debugowania, ma 'id' w' mBuffer'. Ale jego wartość "mHeight", "mWidth" to "-1", a "mlayoutBounds" to "null". –

+0

Następnie należy ponownie sprawdzić ścieżkę do pliku, ponieważ oznacza to, że obraz nie został "zawyżony" do obiektu bitmapowego. Może możesz spróbować innego obrazu – toantran

Odpowiedz

82

Tworzenie bitmapy 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 rodzica i szerokość a następnie użyć Bitmap.createScaledBitmap funkcję.

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

+1

Mam już moje rozwiązanie dawno temu, ale wezmę to jako poprawną odpowiedź, ponieważ może on również obsługiwać błędy OOM, podczas gdy " ponowne ładowanie dużego obrazu. Bardzo czyste i ładne rozwiązanie! Dzięki! –

+1

Zakładam, że imageName jest tutaj dowolnym ciągiem znaków? czy jest to konkretna nazwa obrazu? – Jeet

+0

@JeetendraChoudhary Tak image Image może być dowolnym końcowym String jako nazwą obrazu. – CodeShadow

48

To działa dla mnie:

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

} 

Edit:

Jeśli powyżej zakodowanej katalogu sdcard nie działa w Twoim przypadku, można pobrać ścieżkę sdcard:

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

Spróbuj pobrać ścieżkę SdCard z 'Environment.getExternalStorageDirectory(). ToString()', a następnie spróbuj – Antarix

0

Nie możesz uzyskać dostępu do swoich rysunków za pomocą ścieżki, więc jeśli chcesz mieć czytelny dla człowieka interfejs ze swoimi rysunkami, które możesz skompilować programowo.

zadeklarować 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 za 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); 
3

Cóż, za pomocą statycznego Drawable.createFromPath(String pathName) wydaje się nieco łatwiejsze do mnie niż dekodowanie go samodzielnie ... :-)

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

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

Pamiętaj, że powinieneś wyjaśnić kod podany w odpowiedzi. –

18

tu jest rozwiązanie:

Bitmap bitmap = BitmapFactory.decodeFile(filePath); 
Powiązane problemy