从文件路径创建位图/绘图


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)->是否为您返回一个Bitmap对象?你可以验证吗?
toantran

1
@ autobot_101在调试模式下,id位于中mBuffer。但它的mHeightmWidth价值是-1mLayoutBoundsnull
Nari Kim Shin

然后,您应该再次检查文件路径,因为这意味着您的图像尚未“膨胀”到位图对象。也许您可以尝试其他图像
toantran

1
@ autobot_101实际上我从此图像路径获取Cursor并尝试了其他图像,但结果相同。另外,我检查了路径adb shell,发现该路径中存在图像。
Nari Kim Shin

Answers:


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.createScaledBitmapfunction。

我认为您输入的文件路径错误。:) 希望这可以帮助。


1
很早以前我已经有了解决方案,但是我将其作为正确的答案,因为在加载大尺寸图像时,它还可以处理OOM错误。非常干净和不错的解决方案!谢谢!
Nari Kim Shin

1
我假设这里的imageName是任何字符串?还是任何特定的imageName?
截拳道

@JeetendraChoudhary是imageName可以是任何最终String作为图像名称。
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
请注意,您应该解释答案中提供的代码。
Daniel Nugent

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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.