首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fresco使用DataSubscriber加载gif

Fresco使用DataSubscriber加载gif
EN

Stack Overflow用户
提问于 2016-05-12 15:37:54
回答 1查看 603关注 0票数 0

当我得到CloseableAnimatedImage的时候,我想通过DataSubscriber by Fresco.But得到gif,我不知道怎么得到它的位图。

代码语言:javascript
复制
 public void getBitmap(String url, final OnBitmapFetchedListener listener) {
            ImageRequest request = ImageRequest.fromUri(Uri.parse(url));

        final ImagePipeline imagePipeline = Fresco.getImagePipeline();
        DataSource<CloseableReference<CloseableImage>>
                dataSource = imagePipeline.fetchDecodedImage(request, null);

        DataSubscriber dataSubscriber = new BaseDataSubscriber<CloseableReference<CloseableImage>>() {

            @Override
            protected void onNewResultImpl(DataSource<CloseableReference<CloseableImage>> closeableReferenceDataSource) {

                CloseableReference<CloseableImage> imageReference = closeableReferenceDataSource.getResult();
                if (imageReference != null) {
                    try {
                        CloseableImage image = imageReference.clone().get();
                        if (image instanceof CloseableAnimatedImage) {
                            //here i get the gif but i don't know how to get the bitmap
                        }    
                    }
                }
            }

我尝试了另一种方法来获得图片的位图:

代码语言:javascript
复制
fun getBitmap(uri: Uri, listener: OnBitmapFetchedListener) {
val request = ImageRequest.fromUri(uri)

val imagePipeline = Fresco.getImagePipeline()
val dataSource = imagePipeline.fetchEncodedImage(request, null)

val dataSubscriber = object : BaseDataSubscriber<CloseableReference<PooledByteBuffer>>() {

    override fun onNewResultImpl(closeableReferenceDataSource: DataSource<CloseableReference<PooledByteBuffer>>) {

        val imageReference = closeableReferenceDataSource.result
        if (imageReference != null) {
            try {
                val image = imageReference.clone().get()

                val inputStream = PooledByteBufferInputStream(image)

                val imageFormat = ImageFormatChecker.getImageFormat(inputStream)

                Log.e("ImageUtil", "imageFormat = ${ImageFormat.getFileExtension(imageFormat)}")
                val bitmap = BitmapFactory.decodeStream(inputStream)

                listener.onSuccess(bitmap)

            } catch (e: IOException) {
                Log.e("ImageUtil", "error:$e")
            } finally {
                imageReference.close()
            }
        }
    }

    override fun onFailureImpl(closeableReferenceDataSource: DataSource<CloseableReference<PooledByteBuffer>>) {
        Log.e("ImageUtil", "fail")

        listener.onFail()
    }
}

这是kotlin代码,我所做的就是使用fetchEncodedImage并获取图片的inputStream。但它总是使用onFailImpl(),我不知道为什么。

EN

回答 1

Stack Overflow用户

发布于 2016-05-19 23:14:18

似乎真正的问题是如何静态地只显示动画图像的第一帧。目前还不支持这一点,但它将非常容易实现。

Fresco已有ImageDecodeOptions对象。您只需要在其中添加另一个字段:public final boolean decodeAsStaticImage。然后,在ImageDecoder.decodeGif中,您只需更改:

代码语言:javascript
复制
if (GifFormatChecker.isAnimated(is)) {
  return mAnimatedImageFactory.decodeGif(...);
}
return decodeStaticImage(encodedImage);

至:

代码语言:javascript
复制
if (!options.decodeAsStaticImage && GifFormatChecker.isAnimated(is)) {
  return mAnimatedImageFactory.decodeGif(...);
}
return decodeStaticImage(encodedImage);

请随时实现这一点,并向我们的GitHub Fresco repository提出拉取请求。

然后在客户端代码中,您只需要使用ImageRequestBuilder.setImageDecodeOptions为图像请求设置解码选项。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37180274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档