ファイルパスからビットマップ/ドローアブルを作成する


83

既存のファイルパスからビットマップまたはドローアブルを作成しようとしています。

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(path)->これはビットマップオブジェクトを返しますか?確認できますか?
toantran 2013年

1
@デバッグモードでautobot_101は、それが持っているid中でmBuffer。しかし、そのmHeightmWidth値は、、-1およびmLayoutBoundsですnull
ナリキム・新

次に、ファイルパスをもう一度確認する必要があります。これは、画像がビットマップオブジェクトに「膨張」していないことを意味します。たぶんあなたは別の画像を試すことができます
toantran 2013年

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ですか?
Jeet 2016年

@JeetendraChoudharyはいimageNameは、画像の名前として任意の最後の文字列にすることができます。
codeShadow 2016年

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 2013年


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
回答で提供するコードを説明する必要があることに注意してください。
ダニエルニュージェント2015

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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.