版权声明:本文为博主原创文章,未经博主同意不得转载。

https://blog.csdn.net/jingxia2008/article/details/32327699

问题来源

android 能够在 gallery 里面显示内部存储的图片,支持 jpeg。png,gif,bmp 等,甚至文件类型和图片后缀名不一致。仅仅要是图片文件就能显示,然后 git 仅仅会显示第一帧图像,然而 android 事实上是能够显示 gif 动画的,在浏览器里打开 gif 动画,就能够正常载入显示。

Gallery 查看图片

gallery 实现了 Gallery/src/com/android/camera/ViewImage.java   
                        ImageViewTouchBase newView =
mSlideShowImageViews[mSlideShowImageCurrent];
newView.setVisibility(View.VISIBLE);
newView.setImageRotateBitmapResetBase(bitmap, true);
newView.bringToFront();

通过自己实现的  ImageViewTouchBase 装载图片并显示

ImageViewTouchBase 继承自 framework 的 ImageView
package com.android.camera;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.widget.ImageView; abstract class ImageViewTouchBase extends ImageView {

framework 处理图片

ImageView 是 android 图片框架实现通用图片处理显示类:
能够显示 resource 里面的图片,
    public void setImageResource(int resId) {
if (mUri != null || mResource != resId) {
updateDrawable(null);
mResource = resId;
mUri = null; final int oldWidth = mDrawableWidth;
final int oldHeight = mDrawableHeight; resolveUri(); if (oldWidth != mDrawableWidth || oldHeight != mDrawableHeight) {
requestLayout();
}
invalidate();
}
}

我们在 gallery 里面打开的图片调用是通过 uri 传过来的,

    public void setImageURI(Uri uri) {
if (mResource != 0 ||
(mUri != uri &&
(uri == null || mUri == null || !uri.equals(mUri)))) {
updateDrawable(null);
mResource = 0;
mUri = uri; final int oldWidth = mDrawableWidth;
final int oldHeight = mDrawableHeight; resolveUri(); if (oldWidth != mDrawableWidth || oldHeight != mDrawableHeight) {
requestLayout();
}
invalidate();
}
}

android 会解析 uri 得到目标文件路径

        } else if (mUri != null) {
String scheme = mUri.getScheme();
if (ContentResolver.SCHEME_ANDROID_RESOURCE.equals(scheme)) {
try {
// Load drawable through Resources, to get the source density information
ContentResolver.OpenResourceIdResult r =
mContext.getContentResolver().getResourceId(mUri);
d = r.r.getDrawable(r.id);
} catch (Exception e) {
Log.w("ImageView", "Unable to open content: " + mUri, e);
}
} else if (ContentResolver.SCHEME_CONTENT.equals(scheme)
|| ContentResolver.SCHEME_FILE.equals(scheme)) {
InputStream stream = null;
try {
stream = mContext.getContentResolver().openInputStream(mUri);
d = Drawable.createFromStream(stream, null);
} catch (Exception e) {
Log.w("ImageView", "Unable to open content: " + mUri, e);
} finally {
if (stream != null) {
try {
stream.close();
} catch (IOException e) {
Log.w("ImageView", "Unable to close content: " + mUri, e);
}
}
}
} else {
d = Drawable.createFromPath(mUri.toString());
}

我们点击 gallery 的图片会产生包括 content 的 uri:

I/ActivityManager( 1304): START u0 {dat=content://media/external/images/media/21 cmp=com.android.gallery/com.android.camera.ViewImage (has extras)} from pid 1706
然后通过 Drawable 从 inputstream 里面解析创建 Drawable 对象
    public static Drawable createFromStream(InputStream is, String srcName) {
Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, srcName != null ? srcName : "Unknown drawable");
try {
return createFromResourceStream(null, null, is, srcName, null);
} finally {
Trace.traceEnd(Trace.TRACE_TAG_RESOURCES);
}
}

后面的流程就是交给 skia 解析然后获得一个 bitmap 并返回了。 skia 的 decode 能够自己主动识别 steam 里面的数据流创建对应的 decoder。

问题答案

framework 是通用的图片显示处理,最后仅仅返回了一个 bitmap ,所以 gif 仅仅能处理第一帧图像了。可是 browser 是从新实现了图像显示接口,有专门针对 gif 的显示处理,所以能够显示动画。

android 图片解码显示流程的更多相关文章

  1. 【STM32H7教程】第58章 STM32H7的硬件JPEG应用之图片解码显示

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第58章       STM32H7的硬件JPEG应用之图片解 ...

  2. Android 图片缩略图显示

    //通过openRawResource获取一个inputStream对象 InputStream inputStream = getResources().openRawResource(R.draw ...

  3. Android实现GIF图片解码与播放

    Android实现GIF图片解码与播放 如何在Android中播放GIF图片呢?如果直接按以前的方法,分解图片,可能相对比较麻烦. 今天给大伙介绍一种新的方式,构造自己的Android图片解码帮助类, ...

  4. Android图片加载框架最全解析(二),从源码的角度理解Glide的执行流程

    在本系列的上一篇文章中,我们学习了Glide的基本用法,体验了这个图片加载框架的强大功能,以及它非常简便的API.还没有看过上一篇文章的朋友,建议先去阅读 Android图片加载框架最全解析(一),G ...

  5. 从代码分析Android-Universal-Image-Loader的图片加载、显示流程

    从UNIVERSAL IMAGE LOADER. PART 3(四个DisplayImage重载方法详解)中,我们学习了Android-Universal-Image-Loader(以下简称UIL)中 ...

  6. 我的Android最佳实践之—— ImageView中图片拉伸显示

    通过设置android:scaleType="fitXY"使得图片拉伸显示.补充:scaleType的属性有matrix(默认).center.centerCrop.centerI ...

  7. Android:属性scaleType与图片的显示

    ImageView是Android中的基础图片显示控件,该控件有个重要的属性是ScaleType,该属性用以表示显示图片的方式, 共有8种取值 matrix 用矩阵来绘制(从左上角起始的矩阵区域) f ...

  8. 怪胎:Android开发ImageView图片无法显示

    今天碰到一个非常奇怪的问题: 在Android中ImageView无法显示加载的本地SDCard图片. 具体过程是:先调用本地照相机程序摄像,然后将拍摄的图片加载在ImageView中显示. publ ...

  9. Android中Gallery显示手机中的图片

    在网上找了好久似乎都没有关于这方面的(可能是自己的信息量太小吧),于是自己来填补这个漏洞吧. 常见的方法莫过于自己定义一个数组,用以存储图片的引用,如: 1 private Integer[] pic ...

随机推荐

  1. JS-构造函数2

    一.如何创建对象 1.对象字面量 var obj1={ name:"吻别", singer:"张学友", type:"流行" } 2.构造函 ...

  2. php fpm深度解析

    摘自:https://www.cnblogs.com/wanghetao/p/3934350.html 当我们在谈到cgi的时候,我们在讨论什么 最早的Web服务器简单地响应浏览器发来的HTTP请求, ...

  3. 『Sklearn』特征向量化处理

    『Kaggle』分类任务_决策树&集成模型&DataFrame向量化操作 1 2 3 4 5 6 7 8 9 '''特征提取器''' from sklearn.feature_extr ...

  4. ScoketTimeout Exception浅析

    以前都是用WebService的方式调用服务方的服务,此次直接调用别人的http服务. 使用的客户端是org.apache.http.client.HttpClient. 用的httpclient-4 ...

  5. SecureCRT 7.2.0 Mac版密码无法保存的解决办法

    参考:http://jingyan.baidu.com/article/915fc414fda5fb51394b20bd.html 我之前在网上找的解决办法都是SecureCRT 7.2.0 Mac ...

  6. 日志易——中国版的splunk

    https://www.rizhiyi.com/ 日志易——中国版的splunk 官方号称 10万EPS (Event Per Second) 其他链接: http://doc.mbalib.com/ ...

  7. 遍历HashMap的方法(四)

    Map map = new HashMap(); for (Iterator iter = map.entrySet().iterator(); iter.hasNext();) { Map.Entr ...

  8. kill prefix out 1 homo,hemero out1

    1● homo 同性恋者     2●hetero 异性恋者  

  9. 使用Windbg解析dump文件

    WinDbg OllyDbg SoftICE (已经停止更新) 虽说WinDbg在无源码调试方面确实比较困难,但在调试内核方面却真的有独到之处. https://www.pediy.com/kssd/ ...

  10. learning uboot support web http function in qca4531 cpu

    reference :https://forum.openwrt.org/viewtopic.php?id=43237 reference :http://blog.chinaunix.net/uid ...