使用DataSubscriber加载gif的壁画

我想通过DataSubscriber通过Fresco.G获取GIF,但当我得到的CloseableAnimatedImage,我不知道如何得到它的位图。

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

我试图另一种方式来获取图片的位图:

 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。 但是它总是继续失败IfI(),我不知道为什么。

看来真正的问题是如何静态显示动画图像的第一帧。 目前还不支持,但实现起来非常容易。

壁画已经有ImageDecodeOptions对象。 你只需要在那里添加另一个字段: public final boolean decodeAsStaticImage 。 然后在ImageDecoder.decodeGif中,你只需要改变:

 if (GifFormatChecker.isAnimated(is)) { return mAnimatedImageFactory.decodeGif(...); } return decodeStaticImage(encodedImage); 

至:

 if (!options.decodeAsStaticImage && GifFormatChecker.isAnimated(is)) { return mAnimatedImageFactory.decodeGif(...); } return decodeStaticImage(encodedImage); 

请随意实现这一点,并向我们的GitHub Fresco存储库提出请求。

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