从文件系统加载图片的 Picasso

80

我能否使用Picasso库从文件系统加载图片?

我正在使用startActivityForResult让用户从图库选择一张照片,然后想要展示所选的图片。

我已经有工作代码来获取图像文件系统Uri,但无法让Picasso.load()方法正常工作。

7个回答

165
当然可以。实际上很简单:
File f = new File("path-to-file/file.png");
File f = new File(uri);

Picasso.get().load(f).into(imageView);
也。
Picasso.get().load(uri).into(imageView);

工作


10
我不知道Picasso需要什么“特定”的URI格式来从文件系统(以字符串格式)加载图片。但是我尝试使用ActivityResult返回的格式,直接传递字符串时无法正常工作,直到我传递了一个文件对象。 - Gonan
6
我正在尝试做这件事,但是它没有起作用,我从另一个活动获取了一个文件到我的应用缓存中,但 Picasso 没有加载它... - Loenix
1
patrickf的答案解决了问题,但是由于自回答发布以来Picasso已经有所改变,因此您需要使用以下语法:Picasso.get().load(f).into(imageView);或者Picasso.get().load(uri).into(imageView);或者Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(imageView); - Tom Larcher

30

是的,你可以。

尝试一下:

Picasso.with(context).load(new File(YOUR_FILE_PATH)).into(imageView);

编辑

你也可以调用 .load(YOUR_URI)


25
在查看源代码时,我还发现您可以通过在图像路径前添加“file:”字符串前缀来从文件系统加载图像。例如:
file:path/to/your/image

另外,当使用 startActivityForResult 时,您会得到类似于以下内容:

Uri imageContent = data.getData();

那么,您可以直接调用Picasso.with(getContext()).load(imageContent.toString).into(imageView);,无需创建Cursor并查询图像路径。


3
谢谢你,直到看到你的回答提到需要添加“file:”前缀,我的问题才得到解决。 - henrykodev
我不知道为什么它不起作用。这是我的路径 - “file:/storage/emulated/0/Android/data/com.fittingroom.newtimezone/files/default/AvatarPackage/DEFAULT_MY_AVATAR/pose1.jpeg”,但没有任何结果。 - Sirop4ik
1
@AlekseyTimoshchenko 应该以 file:// 开始。你的 Uri 缺少第二个 / - Sufian

11

试试这个:

Picasso.with(context)
.load("file://"+path) // Add this
.config(Bitmap.Config.RGB_565)
.fit().centerCrop()
.into(imageView);

它完美地为我工作。


嗯,如果你的图片很大而导致内存受限,我会使用RGB_8888。 - Zharf

7
> Picasso.get().load(R.drawable.landing_screen).into(imageView1);
> Picasso.get().load("file:///android_asset/DvpvklR.png").into(imageView2);
> Picasso.get().load(new File(...)).into(imageView3);

1
这是使用新版本的Picasso的方法。Picasso.with()不再可用。 - Inn0vative1

2
基本上我们需要三个东西,Context、图片的路径和ImageView容器。
旧版本Picasso:
 Picasso.with(context).load("/files/my_image.jpg").into(myImageView);

Picasso 的新版本:

 Picasso.get().load("/files/my_image.jpg").into(myImageView);

但我们可以利用更多的选项:

  .resize(20, 20)
  .centerCrop()
  .placeholder(R.drawable.user_placeholder)
  .error(R.drawable.user_placeholder_error)

等等看:http://square.github.io/picasso/

更多信息:


0
如果有人想用Kotlin实现这个,那么这里就是代码...
//变量
private lateinit var addImage: ImageView  // set the id of your ImageView
private lateinit var imageUri: Uri

//打开相册选择图片

val gallery = Intent()
        gallery.type = "image/*"
        gallery.action = Intent.ACTION_GET_CONTENT

        startActivityForResult(Intent.createChooser(gallery, "Select picture"), PICK_IMAGE)

//下一个

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == PICK_IMAGE && resultCode == RESULT_OK) {
            imageUri = data?.data!!
            try {

                Picasso.get()
                    .load(imageUri)
                    .into(addImage)

            } catch (e: Throwable) {
                e.printStackTrace()
            }
        }
    }

这就是你所需要的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接