Android开发笔记(一百七十四)图像解码器ImageDecoder

您所在的位置:网站首页 安卓sstv解码 Android开发笔记(一百七十四)图像解码器ImageDecoder

Android开发笔记(一百七十四)图像解码器ImageDecoder

2024-06-13 08:12| 来源: 网络整理| 查看: 265

早期的Android只支持三种图像格式,分别是JPEG、PNG和GIF,虽然这三类图片都能在ImageView上显示,但对于GIF格式来说,图像视图仅能显示动图的初始画面,无法直接播放动画效果。此外,由于JPEG、PNG和GIF三兄弟历史悠久,当时的图像压缩算法不尽完美,并且手机摄像头的分辨率越来越高,导致一张高清照片动辄几M乃至十几M大小,使得手机的存储空间越发吃紧,这也要求更高效的压缩算法。 目前智能手机行业仅剩安卓和iOS两大阵营,为了争夺移动互联网时代的技术高地,两大阵营的盟主纷纷推出新的图像压缩算法,安卓阵营的谷歌推出了WebP格式,而iOS阵营的苹果推出了HEIF格式。尽管WebP与HEIF出自不同的厂商,但它俩都具备了下列的优异特性: 1、支持透明背景;(JPEG不支持透明背景) 2、支持动画效果;(JPEG和PNG不支持动画效果) 3、支持有损压缩;(PNG和GIF不支持有损压缩,因此它们的图片体积较大) 正因为WebP与HEIF如此优秀,所以它们在手机上愈加流行,从Android9开始便支持浏览这两种格式的图片,从Android10开始更允许将拍摄的照片保存为HEIF格式(同时需要硬件支持)。ImageDecoder正是Android9推出的新型图像解码器,它不但兼容常规的JPEG和PNG图片,还适配GIF、WebP、HEIF的动图效果,可谓新老图片类型一网打尽。利用图像解码器加载并显示图片的步骤分为以下三步: 1、调用ImageDecoder的createSource方法,从指定地方获得数据源; 2、调用ImageDecoder的decodeDrawable方法,从数据源解码得到Drawable类型的图形信息; 3、调用图像视图的setImageDrawable,设置图像视图的图形对象; 其中第一步的createSource方法允许从多处来源读取图像信息,包括但不限于: 1、来自存储卡的File对象; 2、来自系统相册的Uri对象; 3、来自资源图片的图形编号; 4、从输入流获取的字节数组; 举个例子,现在准备通过ImageDecoder加载相册中的某张图片,此时从系统媒体库得到Uri类型的图片路径,则详细的图像加载代码示例如下:

// 利用Android9.0新增的ImageDecoder读取图片 ImageDecoder.Source source = ImageDecoder.createSource(getContentResolver(), imageUri); // 从数据源解码得到图形信息 Drawable drawable = ImageDecoder.decodeDrawable(source); iv_photo.setImageDrawable(drawable); // 设置图像视图的图形对象

单看上述的加载代码,似乎ImageDecoder并无什么优势,因为若是JPEG或者PNG图片,直接调用图像视图的setImageURI方法即可。当然,ImageDecoder的存在意义是为了处理新的图片格式,而不是在老格式上一争高下。它主要在如下两个方面做了增强: (1)调用带两个参数的decodeDrawable方法,此时输入第二个监听器参数,在监听器中可以获得图像的媒体类型,以及该图像是否为动图; (2)判断解码得到的图形对象是否为Animatable类型,如果是的话,则调用start方法播放动画; 根据上述两个增强手段,补齐后的动图播放代码如下所示:

// 显示指定来源的图像 private void showImageSource(ImageDecoder.Source source) throws IOException { // 从数据源解码得到图形信息 Drawable drawable = ImageDecoder.decodeDrawable(source, new OnHeaderDecodedListener() { @Override public void onHeaderDecoded(ImageDecoder decoder, ImageDecoder.ImageInfo info, ImageDecoder.Source source) { // 获取图像信息的媒体类型与是否动图 String desc = String.format("该图片类型为%s,它%s动图", info.getMimeType(), info.isAnimated()?"是":"不是"); tv_info.setText(desc); } }); iv_pic.setImageDrawable(drawable); // 设置图像视图的图形对象 if (drawable instanceof Animatable) { // 如果是动画图形,则开始播放动画 ((Animatable) iv_pic.getDrawable()).start(); } }

接着给出一张GIF图片,运行包含以上代码的测试App,观察到动图播放效果如下面两图所示。 在这里插入图片描述 在这里插入图片描述

再分别给出WebP图片与HEIF图片,重新运行测试App,观察到图像浏览界面如下面两图所示。 在这里插入图片描述 在这里插入图片描述

至此充分展示了图像解码器的强大功能,它不仅支持WebP与HEIF这两种新兴图片格式,还能直接播放动图的动画特效。

点此查看Android开发笔记的完整目录



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3