Створіть Bitmap / Drawable з шляху до файлу


83

Я намагаюся створити Bitmap або Drawable з існуючого шляху до файлу.

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

Але setImageBitmap(), setImageDrawable()не показує зображення із шляху. Я надрукував шлях із, mTextі він виглядає так:/storage/sdcard0/DCIM/100LGDSC/CAM00001.jpg

Що я роблю не так? Хто-небудь може мені допомогти?


BitmapFactory.decodeFile (шлях) -> це повертає для вас об'єкт Bitmap? Ви можете це перевірити?
тоантран

1
@ autobot_101 в режимі налагодження, він має idв mBuffer. Але його mHeight, mWidthцінність є -1, і mLayoutBoundsє null.
Нарі Кім Шін

Тоді вам слід перевірити шлях до вашого файлу ще раз, оскільки це означає, що ваше зображення не було «завищеним» до растрового об'єкта. Можливо, ви можете спробувати інше зображення
toantran

1
@ autobot_101 насправді я отримав цей шлях до зображень Cursorі спробував інші зображення, але той же результат. Крім того, я перевірив шлях через adb shellі виявив, що зображення існують у цьому шляху.
Нарі Кім Шін

Відповіді:


140

Створіть растрове зображення із шляху до файлу:

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

Якщо ви хочете масштабувати растрове зображення до батьківської висоти та ширини, використовуйте Bitmap.createScaledBitmapфункцію.

Я думаю, ви вказали неправильний шлях до файлу. :) Сподіваюся, це допомагає.


1
Я вже давно отримав своє рішення, але я сприйму це як правильну відповідь, оскільки воно також може обробляти помилки OOM під час завантаження великомасштабного зображення. Дуже чисте та приємне рішення! Дякую!
Нарі Кім Шін

1
Я припускаю, що imageName тут є будь-який рядок? чи це якесь конкретне imageName?
Джит

@JeetendraChoudhary Так imageName може бути будь-яким кінцевим рядком як ім'я зображення.
CodeShadow

61

Це працює для мене:

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

}

Редагувати:

Якщо вищезазначений каталог sdcard не працює у вашому випадку, ви можете отримати шлях sdcard:

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

3
Спробуйте отримати шлях до SdCard, Environment.getExternalStorageDirectory().toString()а потім спробуйте
Antarix


3

Ну, використання статики Drawable.createFromPath(String pathName)мені здається дещо простішим, ніж самому декодуванню ... :-)

Якщо ваш mImgпростий ImageView, вам навіть не потрібен, використовуйте mImg.setImageUri(Uri uri)безпосередньо.


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
Зверніть увагу, що вам слід пояснити код, який ви надаєте у відповіді.
Даніель Наджент

0

Ви не можете отримати доступ до своїх малюнків через шлях, тому, якщо ви хочете зрозумілий для людей інтерфейс із вашими малюнками, ви можете створювати їх програмно.

оголосіть 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
  }
}

Тепер для доступу -

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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.