zjupure / GlideWebpDecoder

A Glide WebpDecoder Intergration Library for decoding and displaying webp images
Apache License 2.0
739 stars 91 forks source link

CenterInside | CenterCrop can't support WEBP #52

Closed xiaoxiaohua333 closed 2 years ago

xiaoxiaohua333 commented 4 years ago

device : Pixel 2 / android 9

implementation 'com.github.bumptech.glide:glide:4.10.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.10.0' implementation "com.zlc.glide:webpdecoder:1.6.4.10.0"

Just use FitCenter / CircleCrop

Transformation fitCenter = new FitCenter(); request.optionalTransform(fitCenter) .optionalTransform(WebpDrawable.class, new WebpDrawableTransformation(fitCenter));

zjupure commented 4 years ago

what‘s wrong with the effect? Please run the sample app to see.

857288218 commented 3 years ago

不支持CenterCrop() 还有RoundedCorners一起使用吗

zjupure commented 3 years ago

@857288218 支持,多种效果组合可以使用MultiTransform

crazyfinger commented 3 years ago

When playing animated webp on Xiaomi 10, centerCrop doesn't work right. These are spaces in bottom and right side.

ArtRoman commented 3 years ago

I can't set fitCenter() to animated webp, no image will be shown.

Code (kotlin):

GlideApp.with(context).load(stickerFile)
            .listener(requestListener)
            .diskCacheStrategy(DiskCacheStrategy.ALL)
            .transition(GenericTransitionOptions.with(android.R.anim.fade_in))
            .dontAnimate()
            .fitCenter()
            .into(imageView)

Error in logs:

Error loading image /sdcard/stickers/shy/shy4.webp
com.bumptech.glide.load.engine.GlideException: Failed to load resource
Caused by: java.lang.IllegalArgumentException: Unable to convert com.bumptech.glide.integration.webp.decoder.WebpDrawable@c40c1d0 to a Bitmap
    at com.bumptech.glide.load.resource.bitmap.DrawableTransformation.transform(DrawableTransformation.java:55)
    at com.bumptech.glide.load.engine.DecodeJob.onResourceDecoded(DecodeJob.java:568)
    at com.bumptech.glide.load.engine.DecodeJob$DecodeCallback.onResourceDecoded(DecodeJob.java:632)
    at com.bumptech.glide.load.engine.DecodePath.decode(DecodePath.java:60)
    at com.bumptech.glide.load.engine.LoadPath.loadWithExceptionList(LoadPath.java:76)
    at com.bumptech.glide.load.engine.LoadPath.load(LoadPath.java:57)
    at com.bumptech.glide.load.engine.DecodeJob.runLoadPath(DecodeJob.java:529)
    at com.bumptech.glide.load.engine.DecodeJob.decodeFromFetcher(DecodeJob.java:493)
    at com.bumptech.glide.load.engine.DecodeJob.decodeFromData(DecodeJob.java:479)
    at com.bumptech.glide.load.engine.DecodeJob.decodeFromRetrievedData(DecodeJob.java:430)
    at com.bumptech.glide.load.engine.DecodeJob.onDataFetcherReady(DecodeJob.java:394)
    at com.bumptech.glide.load.engine.SourceGenerator.onDataReadyInternal(SourceGenerator.java:148)
    at com.bumptech.glide.load.engine.SourceGenerator$1.onDataReady(SourceGenerator.java:76)
    at com.bumptech.glide.load.model.ByteBufferFileLoader$ByteBufferFetcher.loadData(ByteBufferFileLoader.java:62)
    at com.bumptech.glide.load.engine.SourceGenerator.startNextLoad(SourceGenerator.java:70)
    at com.bumptech.glide.load.engine.SourceGenerator.startNext(SourceGenerator.java:63)
    at com.bumptech.glide.load.engine.DecodeJob.runGenerators(DecodeJob.java:311)
    at com.bumptech.glide.load.engine.DecodeJob.runWrapped(DecodeJob.java:280)
    at com.bumptech.glide.load.engine.DecodeJob.run(DecodeJob.java:235)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.lang.Thread.run(Thread.java:920)
    at com.bumptech.glide.load.engine.executor.GlideExecutor$DefaultThreadFactory$1.run(GlideExecutor.java:393)

All is working good without fitCenter(). But GIF animations without fitCenter() are not playable when ImageView is much larger than real image size. So I'm using a workaround

            if (stickerFile.extension == "gif") {
                // required to play animation, but webp not works with this transform
                loader.fitCenter()
            }

before calling loader.load()

My build config: implementation "com.github.bumptech.glide:glide:4.12.0" implementation "com.zlc.glide:webpdecoder:2.0.4.12.0" kapt "com.github.bumptech.glide:compiler:4.12.0"

zjupure commented 3 years ago

I can't set fitCenter() to animated webp, no image will be shown.

Code (kotlin):

GlideApp.with(context).load(stickerFile)
            .listener(requestListener)
            .diskCacheStrategy(DiskCacheStrategy.ALL)
            .transition(GenericTransitionOptions.with(android.R.anim.fade_in))
            .dontAnimate()
            .fitCenter()
            .into(imageView)

Error in logs:

Error loading image /sdcard/stickers/shy/shy4.webp
com.bumptech.glide.load.engine.GlideException: Failed to load resource
Caused by: java.lang.IllegalArgumentException: Unable to convert com.bumptech.glide.integration.webp.decoder.WebpDrawable@c40c1d0 to a Bitmap
  at com.bumptech.glide.load.resource.bitmap.DrawableTransformation.transform(DrawableTransformation.java:55)
  at com.bumptech.glide.load.engine.DecodeJob.onResourceDecoded(DecodeJob.java:568)
  at com.bumptech.glide.load.engine.DecodeJob$DecodeCallback.onResourceDecoded(DecodeJob.java:632)
  at com.bumptech.glide.load.engine.DecodePath.decode(DecodePath.java:60)
  at com.bumptech.glide.load.engine.LoadPath.loadWithExceptionList(LoadPath.java:76)
  at com.bumptech.glide.load.engine.LoadPath.load(LoadPath.java:57)
  at com.bumptech.glide.load.engine.DecodeJob.runLoadPath(DecodeJob.java:529)
  at com.bumptech.glide.load.engine.DecodeJob.decodeFromFetcher(DecodeJob.java:493)
  at com.bumptech.glide.load.engine.DecodeJob.decodeFromData(DecodeJob.java:479)
  at com.bumptech.glide.load.engine.DecodeJob.decodeFromRetrievedData(DecodeJob.java:430)
  at com.bumptech.glide.load.engine.DecodeJob.onDataFetcherReady(DecodeJob.java:394)
  at com.bumptech.glide.load.engine.SourceGenerator.onDataReadyInternal(SourceGenerator.java:148)
  at com.bumptech.glide.load.engine.SourceGenerator$1.onDataReady(SourceGenerator.java:76)
  at com.bumptech.glide.load.model.ByteBufferFileLoader$ByteBufferFetcher.loadData(ByteBufferFileLoader.java:62)
  at com.bumptech.glide.load.engine.SourceGenerator.startNextLoad(SourceGenerator.java:70)
  at com.bumptech.glide.load.engine.SourceGenerator.startNext(SourceGenerator.java:63)
  at com.bumptech.glide.load.engine.DecodeJob.runGenerators(DecodeJob.java:311)
  at com.bumptech.glide.load.engine.DecodeJob.runWrapped(DecodeJob.java:280)
  at com.bumptech.glide.load.engine.DecodeJob.run(DecodeJob.java:235)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
  at java.lang.Thread.run(Thread.java:920)
  at com.bumptech.glide.load.engine.executor.GlideExecutor$DefaultThreadFactory$1.run(GlideExecutor.java:393)

All is working good without fitCenter(). But GIF animations without fitCenter() are not playable when ImageView is much larger than real image size. So I'm using a workaround

            if (stickerFile.extension == "gif") {
                // required to play animation, but webp not works with this transform
                loader.fitCenter()
            }

before calling loader.load()

My build config: implementation "com.github.bumptech.glide:glide:4.12.0" implementation "com.zlc.glide:webpdecoder:2.0.4.12.0" kapt "com.github.bumptech.glide:compiler:4.12.0"

you should use WebpDrawableTransformation to wrap your original fitCenter transformation because it can only handle Bitmap not Drawable.