Picasso Bild aus Dateisystem laden

76

Kann ich die Picasso-Bibliothek verwenden, um Bilder aus dem Dateisystem zu laden?

Ich verwende startActivityForResult, um den Benutzer ein Foto aus seiner Galerie auswählen zu lassen und dann das ausgewählte Bild anzuzeigen.

Ich habe bereits Arbeitscode Uri, um das Image-Dateisystem abzurufen , kann die Picasso.load()Methode jedoch nicht zum Laufen bringen.

Edrian
quelle

Antworten:

155

Natürlich kannst du. Es ist eigentlich ziemlich einfach:

File f = new File("path-to-file/file.png");

oder

File f = new File(uri);

Picasso.get().load(f).into(imageView);

ebenfalls

Picasso.get().load(uri).into(imageView);

funktioniert

Patrick Favre
quelle
8
Ich weiß nicht, ob es sich um ein "spezifisches" URI-Format handelt, das Picasso benötigt, um die Bilder aus dem Dateisystem zu laden (im String-Format). Aber ich habe das von ActivityResult zurückgegebene verwendet und es hat nicht funktioniert, bis ich ein Dateiobjekt anstelle des Strings direkt übergeben habe.
Gonan
6
Ich versuche das zu tun, aber das funktioniert nicht. Ich habe eine Datei von einer anderen Aktivität in meinen App-Cache bekommen, aber Picasso lädt sie nicht ...
Loenix
1
Patrickfs Antwort macht den Trick, aber da sich Picasso ein wenig geändert hat, seit die Antwort veröffentlicht wurde, müssen Sie die folgende Syntax verwenden: Picasso.get().load(f).into(imageView); oder Picasso.get().load(uri).into(imageView); oder Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(imageView);
Tom Larcher
27

Ja, du kannst.

Versuchen:

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

BEARBEITEN

Sie können .load(YOUR_URI)stattdessen auch anrufen .

egfconnor
quelle
23

Beim Betrachten des Quellcodes stelle ich außerdem fest, dass Sie das Bild aus dem Dateisystem laden können, indem Sie file:Ihrem Bildpfad ein Zeichenfolgenpräfix hinzufügen . Zum Beispiel:

file:path/to/your/image

Wenn Sie startActivityForResult verwenden, erhalten Sie außerdem Folgendes:

Uri imageContent = data.getData();

Anschließend können Sie Picasso.with(getContext()).load(imageContent.toString).into(imageView);direkt aufrufen, ohne einen CursorBildpfad erstellen und abfragen zu müssen.

Edrian
quelle
3
Vielen Dank, meine hat nicht funktioniert, bis ich Ihre Antwort sah, dass das Präfix "file:" benötigt wird.
Henrykodev
Ich weiß nicht, warum es nicht funktioniert. Es gibt meinen Pfad - "Datei: /storage/emulated/0/Android/data/com.fittingroom.newtimezone/files/default/AvatarPackage/DEFAULT_MY_AVATAR/pose1.jpeg", aber jedes Ergebnis (
Aleksey Timoshchenko
1
@AlekseyTimoshchenko sollte es beginnen mit file://. Dein Uri fehlt der zweite /.
Sufian
9

Versuche dies:

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

Es funktioniert perfekt für mich.

Genialer Code
quelle
mh, ich würde RGB_8888 verwenden, es sei denn, Sie haben Probleme mit Speicherbeschränkungen, weil das Bild wirklich groß ist
Zharf
6
> 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);
Tarun Umath
quelle
Dies ist der Weg, um dies mit neuen Versionen von Picasso zu tun. Picasso.with()ist nicht mehr verfügbar.
Inn0vative1
2

Grundsätzlich müssen wir drei Dinge, Context, image´s pathund der ImageViewContainer

//Old version: Picasso.with(context).load("/files/my_image.jpg").into(myImageView);

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

Wir können jedoch weitere Optionen nutzen:

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

usw...

Weitere Informationen: http://square.github.io/picasso/

Jorgesys
quelle
0

Wenn jemand versucht, dies mit Kotlin zu tun, dann ist es hier ...

//Variablen

private lateinit var addImage: ImageView  // set the id of your ImageView
private lateinit var imageUri: Uri

// Galerie öffnen, um ein Bild auszuwählen

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

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

//Nächster

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()
            }
        }
    }

Das ist alles was du brauchst.

Junior
quelle