Создать Bitmap / Drawable из пути к файлу


84

Я пытаюсь создать 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? вы можете это проверить?
toantran

1
@ autobot_101 в режиме отладки, у него idв mBuffer. Но его mHeight, mWidthзначение -1и mLayoutBoundsявляется null.
Нари Ким Шин

Затем вы должны снова проверить путь к файлу, потому что это означает, что ваше изображение не было «раздутым» до растрового объекта. Может быть, вы можете попробовать другой образ
toantran

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

Ответы:


142

Создать растровое изображение из пути к файлу:

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?
Jeet

@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.