web-dev-qa-db-ja.com

AndroidでGlideを使用して元の画像サイズを取得する方法は?

動的なソースから画像を読み込んで、アプリに読み込んでいます。ただし、画像が非常に小さく、アプリで見た目が悪い場合があります。私がやりたいのは、画像サイズを取得することです。5x5より小さい場合は、ImageViewをまったく表示しません。

これを達成する方法は?

SizeReadyCallbackを使用すると、画像ではなくImageViewのサイズが返されます。要求リスナーを使用すると、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

更新:

@TWiStErRobにより、より良いソリューションがコメントで提供されています: better solution


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

ポイントは、ImageViewに設定する前にビットマップを取得することです。

5
thundertrick

この質問は古いものですが、元の画像サイズを確認する必要がある同様のシナリオに出くわしました。少し掘り下げた後、解決策があるGithubの this スレッドを見つけました。

私は最新の(glide v4)をコピーします solution pandasysによって書かれました。

このコードはKotlinですが、Javaユーザーは問題ないはずです。ロードを実行するコードは次のようになります。

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

再利用可能なオプションは次のとおりです。

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

私のサイズクラスはおよそです:

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"

}

ここに私の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)
  }
}

元の質問onResourceReadyコールバックに戻り、幅と高さを確認して、画像を表示するかどうかを決定できます

2
msamhoury