Obtenez de l'image Bitmap à partir d'ImageView chargé avec Picasso
J'avais une méthode qui charge les images, si l'image n'a pas été chargé avant, il va chercher sur un serveur. Puis il stocke dans les applications de système de fichiers. Si il est dans le système de fichiers, il charge l'image plutôt que c'est beaucoup plus rapide que de tirer les images à partir du serveur. Si vous avez chargé l'image avant sans fermer l'application, elle sera stockée dans un dictionnaire statique de sorte qu'il peut être rechargé sans utiliser plus de mémoire, afin d'éviter des erreurs de mémoire insuffisante.
Tout cela a bien fonctionné jusqu'à ce que j'ai commencé à utiliser le Picasso de l'image de chargement de la bibliothèque. Maintenant, je suis le chargement des images dans une ImageView mais je ne sais pas comment faire pour obtenir l'image qui est renvoyée pour que je puisse le stocker dans un fichier ou le dictionnaire statique. Cela a rendu les choses plus difficiles. car cela signifie qu'il essaie de charger l'image depuis le serveur à chaque fois, ce qui est quelque chose que je ne veux pas arriver. Est il possible que je peux obtenir de l'image Bitmap après le chargement dans l'ImageView? Ci-dessous mon code:
public Drawable loadImageFromWebOperations(String url,
final String imagePath, ImageView theView, Picasso picasso) {
try {
if (Global.couponBitmaps.get(imagePath) != null) {
scaledHeight = Global.couponBitmaps.get(imagePath).getHeight();
return new BitmapDrawable(getResources(),
Global.couponBitmaps.get(imagePath));
}
File f = new File(getBaseContext().getFilesDir().getPath()
.toString()
+ "/" + imagePath + ".png");
if (f.exists()) {
picasso.load(f).into(theView);
**This line below was my attempt at retrieving the bitmap however
it threw a null pointer exception, I assume this is because it
takes a while for Picasso to add the image to the ImageView**
Bitmap bitmap = ((BitmapDrawable)theView.getDrawable()).getBitmap();
Global.couponBitmaps.put(imagePath, bitmap);
return null;
} else {
picasso.load(url).into(theView);
return null;
}
} catch (OutOfMemoryError e) {
Log.d("Error", "Out of Memory Exception");
e.printStackTrace();
return getResources().getDrawable(R.drawable.default1);
} catch (NullPointerException e) {
Log.d("Error", "Null Pointer Exception");
e.printStackTrace();
return getResources().getDrawable(R.drawable.default1);
}
}
Toute aide serait grandement appréciée, merci!!!!
OriginalL'auteur shadowarcher | 2014-07-10
Vous devez vous connecter pour publier un commentaire.
Avec Picasso, vous n'avez pas besoin de mettre en place votre propre dictionnaire statique, car il est fait automatiquement pour vous. @intrepidkarthi a raison dans le sens que les images sont automatiquement mises en cache par Picasso la première fois qu'ils sont chargés et donc il n'est pas constamment appeler le serveur pour obtenir la même image.
Cela étant dit, je me suis retrouvé dans une situation similaire: j'ai besoin d'accéder à l'image qui a été téléchargé en vue de la stocker quelque part d'autre dans mon application. Pour cela, j'ai modifié @Gilad Haimov de répondre un peu:
Java, avec une version plus ancienne de Picasso:
Kotlin, avec la version 2.71828 de Picasso:
Cela vous donne accès à la bitmap chargée tandis que toujours en train de charger de manière asynchrone. Vous avez juste à vous rappeler de le mettre dans l'ImageView puisqu'il n'est plus fait automatiquement pour vous.
Sur une note de côté, si vous êtes intéressés de savoir où votre image, vous pouvez accéder à cette information à l'intérieur de cette même méthode. Le deuxième argument de la méthode ci-dessus,
Picasso.LoadedFrom from
, est un enum qui vous permet de savoir à partir de quelle source l'image a été chargé à partir de (les trois sourcesDISK
,MEMORY
, etNETWORK
. (Source). Square Inc. fournit également un moyen visuel de voir où l'image a été chargé à partir en utilisant le debug explication des indicateurs de ici.Espérons que cette aide !
OriginalL'auteur jguerinet
Picasso vous donne un contrôle direct sur les images téléchargées. Pour enregistrer les images téléchargées dans un fichier faire quelque chose comme ceci:
Où:
OriginalL'auteur Gilad Haimov
Puisque vous êtes à l'aide de Picasso, vous pouvez bien voulez en profiter pleinement. Il comprend un puissant mécanisme de mise en cache.
Utilisation
picasso.setDebugging(true)
sur votrePicasso
exemple pour afficher ce genre de mise en cache se produit (les images sont chargées à partir du disque, de la mémoire ou d'un réseau). Voir : http://square.github.io/picasso/ (debug indicateurs)L'instance par défaut de Picasso est configuré (http://square.github.io/picasso/javadoc/com/squareup/picasso/Picasso.html#with-android.content.Context-)
Vous pouvez également spécifier votre
Cache
instance à l'aide dePicasso.Builder
pour personnaliser votre exemple, et vous pouvez spécifier votreDownloader
pour un contrôle plus précis. (Il y a une mise en œuvre deOkDownloader
de Picasso qui est utilisé automatiquement si vous incluezOkHttp
dans votre application.)OriginalL'auteur njzk2
Dans cet exemple j'ai utilisé pour définir l'arrière-plan d'un colapsing de la barre d'outils.
J'espère que cela vous a aidé.
OriginalL'auteur Thialyson Martins