web-dev-qa-db-fra.com

Comment obtenir la taille d'image originale en utilisant Glide sur Android?

Je charge des images à partir de sources dynamiques et les charge dans mon application. Cependant, parfois, les images sont si petites et semblent mauvaises dans mon application. Ce que je veux faire, c'est obtenir la taille de l'image et si elle est inférieure à 5x5, ne pas afficher du tout l'ImageView.

Comment y parvenir?

Lorsque j'utilise sizeReadyCallback, il renvoie la taille de ImageView au lieu de l'image. Lorsque j'utilise l'écouteur de demande, il renvoie 0,0.

Glide.with(getContext()).load(imageUrl).listener(new RequestListener<String, GlideDrawable>() {
        @Override
        public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
            return false;
        }

        @Override
        public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
            //This returns 0,0
            Log.e("TAG","_width: " + resource.getBounds().width() + " _height:" +resource.getBounds().height());
            return false;
        }
    }).into(ivImage).getSize(new SizeReadyCallback() {
        @Override
        public void onSizeReady(int width, int height) {
            //This returns size of imageview.
            Log.e("TAG","width: " + width + " height: " + height);
        }
    });
8
Swifty Swift

Mise à jour:

Une meilleure solution a été fournie par @TWiStErRob dans les commentaires: meilleure solution


Pour Glide v4:

Glide.with(getContext().getApplicationContext())
     .asBitmap()
     .load(path)
     .into(new SimpleTarget<Bitmap>() {
         @Override
         public void onResourceReady(Bitmap bitmap,
                                     Transition<? super Bitmap> transition) {
             int w = bitmap.getWidth();
             int h = bitmap.getHeight()
             mImageView.setImageBitmap(bitmap);
         }
     });

Le point est d'obtenir le bitmap avant de le définir dans un ImageView.

5
thundertrick

Cette question est ancienne, mais je suis tombé sur un scénario similaire où je devais vérifier la taille de l'image d'origine. Après quelques recherches, j'ai trouvé ce thread sur Github qui a la solution.

Je vais copier la dernière (glide v4) solution écrite par pandasys.

Ce code est Kotlin mais Java ne devraient avoir aucun problème. Le code pour faire le chargement ressemblerait à quelque chose comme:

Glide.with(activity)
 .`as`(Size2::class.Java)
 .apply(sizeOptions)
 .load(uri)
 .into(object : SimpleTarget<Size2>() {
   override fun onResourceReady(size: Size2, glideAnimation: Transition<in Size2>) {
     imageToSizeMap.put(image, size)
     holder.albumArtDescription.text = size.toString()
   }

   override fun onLoadFailed(errorDrawable: Drawable?) {
     imageToSizeMap.put(image, Size2(-1, -1))
     holder.albumArtDescription.setText(R.string.Unknown)
   }
 })

Les options réutilisables sont:

private val sizeOptions by lazy {
RequestOptions()
    .skipMemoryCache(true)
    .diskCacheStrategy(DiskCacheStrategy.DATA)}

Ma classe de taille est d'environ:

data class Size2(val width: Int, val height: Int) : Parcelable {
  companion object {
    @JvmField val CREATOR = createParcel { Size2(it) }
  }

  private constructor(parcelIn: Parcel) : this(parcelIn.readInt(), parcelIn.readInt())

  override fun writeToParcel(dest: Parcel, flags: Int) {
    dest.writeInt(width)
    dest.writeInt(height)
  }

  override fun describeContents() = 0

  override fun toString(): String = "$width x $height"

}

Voici la partie pertinente de mon AppGlideModule

 class BitmapSizeDecoder : ResourceDecoder<File, BitmapFactory.Options> {
  @Throws(IOException::class)
  override fun handles(file: File, options: Options): Boolean {
    return true
  }

  override fun decode(file: File, width: Int, height: Int, options: Options): Resource<BitmapFactory.Options>? {
    val bmOptions: BitmapFactory.Options = BitmapFactory.Options()
    bmOptions.inJustDecodeBounds = true
    BitmapFactory.decodeFile(file.absolutePath, bmOptions)
    return SimpleResource(bmOptions)
  }
}:




override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
            registry.prepend(File::class.Java, BitmapFactory.Options::class.Java, BitmapSizeDecoder())
            registry.register(BitmapFactory.Options::class.Java, Size2::class.Java, OptionsSizeResourceTranscoder())


class OptionsSizeResourceTranscoder : ResourceTranscoder<BitmapFactory.Options, Size2> {
  override fun transcode(resource: Resource<BitmapFactory.Options>, options: Options): Resource<Size2> {
    val bmOptions = resource.get()
    val size = Size2(bmOptions.outWidth, bmOptions.outHeight)
    return SimpleResource(size)
  }
}

Revenons donc à la question d'origine, onResourceReady rappel, vous pouvez vérifier la largeur et la hauteur et décider si vous montrez ou non l'image

2
msamhoury