彻底掌握如何有效处理高清大图:Android-Universal-Image-Loader框架解析(三)下载模块,解码模块和显示模块

JQ6500语音模块 一:Note 今天分享一下最近用到的JQ6500语音模块,我主要是用它来做个语音播报功能,同时在使用中遇到的一些问题。 二:使用说明 这个模块一些什么使用场景的废话我就不讲了,主要讲一些比较重要的部分。 1、它的工作电压,这个点我觉得我还挺重要,因为在后面我使用的时候,发现有的时候语音出来是很短,一下就没了,后来发现是电压这里的问题 2、 实物图及原理图,新手刚拿到,就只能按照这个图来连线,对好... 阅读详情

彻底掌握如何有效处理高清大图:Android-Universal-Image-Loader框架解析(一)基本使用
彻底掌握如何有效处理高清大图:Android-Universal-Image-Loader框架解析(二)缓存

在UIL框架中,下载,解码和显示三个模块也是比较核心的内容;这篇我们将逐一分析

  1. 下载模块
    在这里插入图片描述

在这个模块当中,所有的下载类都实现了ImageDownloader接口,其默认下载类为BaseImageDownloader

  BaseImageDownloader主要作用:
他能够从网络,文件系统,app本身资源当中根据图片URL来获得图片的输入流

  BaseImageDownloader核心方法

	@Override
	public InputStream getStream(String imageUri, Object extra) throws IOException {
		switch (Scheme.ofUri(imageUri)) {
			case HTTP:
			case HTTPS:
				return getStreamFromNetwork(imageUri, extra);
			case FILE:
				return getStreamFromFile(imageUri, extra);
			case CONTENT:
				return getStreamFromContent(imageUri, extra);
			case ASSETS:
				return getStreamFromAssets(imageUri, extra);
			case DRAWABLE:
				return getStreamFromDrawable(imageUri, extra);
			case UNKNOWN:
			default:
				return getStreamFromOtherSource(imageUri, extra);
		}
	}

从getStream方法可知,UIL框架提供解析http,https,file,content,assets,和drawable类型的scheme的文件;(我们这里以解析http和https文件为例)

当一个图片的url的scheme以http或者https为开始的时候,则会调用getStreamFromNetwork来从网络下载图片

	protected InputStream getStreamFromNetwork(String imageUri, Object extra) throws IOException {
		HttpURLConnection conn = createConnection(imageUri, extra);

		int redirectCount = 0;
		while (conn.getResponseCode() / 100 == 3 && redirectCount < MAX_REDIRECT_COUNT) {
			conn = createConnection(conn.getHeaderField("Location"), extra);
			redirectCount++;
		}

		InputStream imageStream;
		try {
			imageStream = conn.getInputStream();
		} catch (IOException e) {
			// Read all data to allow reuse connection (http://bit.ly/1ad35PY)
			IoUtils.readAndCloseStream(conn.getErrorStream());
			throw e;
		}
		if (!shouldBeProcessed(conn)) {
			IoUtils.closeSilently(imageStream);
			throw new IOException("Image request failed with response code " + conn.getResponseCode());
		}

		return new ContentLengthInputStream(new BufferedInputStream(imageStream, BUFFER_SIZE), conn.getContentLength());
	}

这个方法比较简单,就是通过HttpURLConnection的方式获得url的输入流,同时在下载的时候,我们应该注意到URL框架默认的重定向次数为5次,同时也可以记住一个小知识点,如果服务端返回的状态码以3开头,则均表示为重定向


  1. 解码模块
    当通过下载模块将图片转换为输入流之后,我们就需要通过解码模块来解码这个输入流了
    在这里插入图片描述

在解码模块当中,ImageDecoder是所有解码器的接口,BaseImageDecoder是默认的解码器,而ImageDecodingInfo里面则是需要解码的信息

  ImageDecodingInfo主要作用
封装解码信息,里面主要包含图片的url信息,图片缩放类型,另外里面有一个重要的成员,即Options decodingOptions;
    Options类,通常用于设置一些加载到内存中的图片的参数,这个在图片加载的时候都会使用这个类来控制加载的图片
Options.inJustDecodeBounds 设置为true,只会返回图片尺寸,不加载图片到内存
Options.inSampleSize 这个值是一个int,当它小于1的时候,将会被当做1处理,如果大于1,那么就会按照比例(1 / inSampleSize)缩小bitmap的宽和高、降低分辨率,大于1时这个值将会被处置为2的倍数。例如,width=100,height=100,inSampleSize=2,那么就会将bitmap处理为,width=50,height=50,宽高降为1 / 2,像素数降为1 / 4
Options.inScaled设置这个Bitmap是否可以被缩放,默认值是true,表示可以被缩放。
Options.inPreferQualityOverSpeed这个值表示是否在解码时图片有更高的品质,仅用于JPEG格式。如果设置为true,则图片会有更高的品质,但是会解码速度会很慢(API24之后被废弃,即24之后,默认解图为高质量,24之前如果设置为true,)
Options.outWidth和Options.outHeight表示这个Bitmap的宽和高,一般和inJustDecodeBounds一起使用来获得Bitmap的宽高,但是不加载到内存
Options.inMutable如果设置为true,则decoder返回的是可变的Bitmap,这可以用来对Bitmap施加一些效果

  BaseImageDecoder主要作用
通过ImageDecodingInfo来获得带解码的图片的scheme,根据scheme去获得对应图片的输入流,BaseImageDecoder根据得到的输入流来进行解码

  BaseImageDecoder核心方法

	public Bitmap decode(ImageDecodingInfo decodingInfo) throws IOException {
		Bitmap decodedBitmap;
		ImageFileInfo imageInfo;

		InputStream imageStream = getImageStream(decodingInfo);
		if (imageStream == null) {
			L.e(ERROR_NO_IMAGE_STREAM, decodingInfo.getImageKey());
			return null;
		}
		try {
			imageInfo = defineImageSizeAndRotation(imageStream, decodingInfo);
			imageStream = resetStream(imageStream, decodingInfo);
			Options decodingOptions = prepareDecodingOptions(imageInfo.imageSize, decodingInfo);
			decodedBitmap = BitmapFactory.decodeStream(imageStream, null, decodingOptions);
		} finally {
			IoUtils.closeSilently(imageStream);
		}

		if (decodedBitmap == null) {
			L.e(ERROR_CANT_DECODE_IMAGE, decodingInfo.getImageKey());
		} else {
			decodedBitmap = considerExactScaleAndOrientatiton(decodedBitmap, decodingInfo, imageInfo.exif.rotation,
					imageInfo.exif.flipHorizontal);
		}
		return decodedBitmap;
	}

  第5行,下载模块BaseImageDownloader根据scheme获得图片的输入流
  第14行,把当前图片流根据Options的参数设置来进行解码,返回Bitmap

  1. 显示模块
    当图片经过下载,然后被解码生成新的bitmap之后,就需要通过显示模块显示在上层界面上了
    在这里插入图片描述

显示模块的基础接口是BitmapDisplayer,各个显示模块均实现了BitmapDisplayer接口,主要作用就是针对bitmap做修改,返回一个新的bitmap,这样就可以显示在上层界面上了,此处以FadeInBitmapDisplayer为例

  FadeInBitmapDisplayer主要作用
imageview显示图片的形式是淡入模式

  FadeInBitmapDisplayer核心代码

	@Override
	public void display(Bitmap bitmap, ImageAware imageAware, LoadedFrom loadedFrom) {
		imageAware.setImageBitmap(bitmap);

		if ((animateFromNetwork && loadedFrom == LoadedFrom.NETWORK) ||
				(animateFromDisk && loadedFrom == LoadedFrom.DISC_CACHE) ||
				(animateFromMemory && loadedFrom == LoadedFrom.MEMORY_CACHE)) {
			animate(imageAware.getWrappedView(), durationMillis);
		}
	}

	/**
	 * Animates {@link ImageView} with "fade-in" effect
	 *
	 * @param imageView      {@link ImageView} which display image in
	 * @param durationMillis The length of the animation in milliseconds
	 */
	public static void animate(View imageView, int durationMillis) {
		if (imageView != null) {
			AlphaAnimation fadeImage = new AlphaAnimation(0, 1);
			fadeImage.setDuration(durationMillis);
			fadeImage.setInterpolator(new DecelerateInterpolator());
			imageView.startAnimation(fadeImage);
		}
	}

代码比较简单,就是设置imageView的显示图片,并展示一个AlphaAnimation动画

【雕爷学编程】Arduino动手做(119)---JQ6500语音模块 雕爷学编程,Arduino动手做,开源硬件,创客传感器,JQ6500语音模块 阅读详情

相关推荐

Android高效图片异步加载实战:ListView、GridView与ViewPager集成

UIL的强大之处在于高度可定制。你可以根据业务需求精细调优每一个环节。你可能会问:UIL现在都不维护了,为什么还要花时间学它?答案很简单:思想永不过时。尽管Glide、Picasso等新框架在API易用性和功能丰富度上更胜一筹,但它们的核心理念——异步加载、三级缓存、内存控制、请求调度——全都源自UIL这类早期探索者。理解UIL,就像是学习计算机组成原理。你知道现在的CPU有多复杂,但只有搞懂了冯·诺依曼架构,才能真正明白计算机是怎么工作的。所以,下次当你轻松写下。

weixin_42593130的博客 1099

Android系统 —— image文件解析

Android系统编译之后的打包阶段,会将所有编译出来的有需要的执行文件,库文件以及各种配置文件等打包到各个镜像文件中。有时候我们需要看一下镜像文件中都打包了什么东西,那就可以通过一些方法将其挂载到一个目录,然后进行查看。.........

In_engineer的博客 7784

jq6500语音芯片

jq6500语音芯片相关软件,驱动,以及51驱动程序C语言,驱动,以及51驱动程序C语言

Universal-Image-Loader源码阅读(29)-BaseImageDownloader

ImageDownLoader的具体实现。 源码: /** * Provides retrieving of {@link InputStream} of image by URI from network or file system or app resources. * {@link URLConnection} is used to retrieve image strea

wbzwind的专栏 521

@transactional滥用导致数据源连接池耗尽问题

@transactional滥用导致数据源连接池耗尽问题

qq_43205267的博客 1201

STM407ZET6+OV5640调试心得

最近一个项目用了STMF407ZET6 +OV5640,调试了好几天做些总结; STMF407ZET6 开发板用的是正点原子的开发板,OV5640摄像头用的是秉火摄像头; 这其中有一个大坑,开发板的DCMI接口跟摄像头的接口不一样,要重新用杜邦线进行连接; 本人是在正点原子的“”15,ATK-OV5640摄像头模块“”源码上进行修改的。

kingseacjh的专栏 8326

JQ6500语音模块详解(STM32)

JQ6500是一种支持串口驱动的语音模块,提供串口的MP3芯片,集成了MP3WMV的硬解码。同时软件支持TF卡驱动,支持电脑直接更新SPI Flash的内容,支持FAT16、FAT32文件系统。通过简单的串口指令即可完成播放指定的音乐,以及如何播放音乐等功能,使用方便,稳定可靠。以下是JQ6500语音模块的参数:型号JQ6500工作电压3.3~5V额定电流20mAUART接口标准串口,TTL电平,波特率可设工作温度-40~80℃湿度5%~95%

qq_44016222的博客 2986

VisionMaster SDK C#二次开发核心技术指南

以下是基于**VisionMaster SDK C#二次开发核心技术指南**,结合实战案例与关键代码解析,帮助开发者快速掌握工业视觉应用集成。

东城十三 3061

彻底掌握如何有效处理高清大图:如何更高效更快速的加载图片

彻底掌握如何有效处理高清大图:Android-Universal-Image-Loader框架解析(一)基本使用 彻底掌握如何有效处理高清大图:Android-Universal-Image-Loader框架解析(二)缓存 彻底掌握如何有效处理高清大图:Android-Universal-Image-Loader框架解析(三)下载模块,解码模块和显示模块   在之前的框架中,当硬盘中有图片缓存的时...

yi_master的博客 1385

慕课软件质量保证与测试(习题集)

慕课金陵科技学院.软件质量保证与测试.期末复习.习题汇总0 总目录1 绪论1.1 软件质量保证与测试的产生与发展1.2 软件缺陷,软件错误,软件故障1.3 软件质量保证与测试的意义,原则和挑战1.4 单元测试1.5 课后作业2 软件测试策略2.1 软件测试的模型,过程和生命周期2.2 软件测试的方法和技术2.3 单元测试2.4 课后作业3 黑盒测试3.1 黑盒测试概述3.2 等价类划分测试3.3 边界值测试3.4 错误推测法3.5 判定表驱动法3.6 因果图法3.7 场景法3.8 正交实验法3.9 单元测试

weixin_42473228的博客 5万+

Yolov8-pose关键点检测:训练准备篇 | 自己数据集从labelme标注到生成yolo格式的关键点数据

yolov8-pose关键点检测系列:从数据集标记到生成适合yolo的关键点格式

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 5875

彻底掌握如何有效处理高清大图:Android-Universal-Image-Loader框架解析(四)URL全流程总述

彻底掌握如何有效处理高清大图:Android-Universal-Image-Loader框架解析(一)基本使用 彻底掌握如何有效处理高清大图:Android-Universal-Image-Loader框架解析(二)缓存 彻底掌握如何有效处理高清大图:Android-Universal-Image-Loader框架解析(三)下载模块,解码模块和显示模块 前面三篇文章系统的介绍了UIL框架使用的核...

yi_master的博客 295

cartographer如何使用2个反光柱子作为一个landmark

2个反光柱的摆放要求:靠着墙摆,因为我们只能从一侧看到2个反光柱,从两侧都看到至少需要3个反光柱来定位。 landmark检测原理:因为我们是从一侧看到2个反光柱,所以看到2个反光柱在一帧激光数据中会有顺序,有2种情形,如下图 这两种情形,我们发现 情形1: 这种情形2个反光柱子被检测到的激光角度小于180,我们认为大一些激光角度的是原点。 情形2: 这种情形2个反光柱子被检测到的激光角度大于180,我们认为小一些激光角度的是原点。 这样原点就固定下来,并是唯一的。2个反光柱构成的坐标系也就确定了。和激光坐

南北粉面馆 3827

彻底掌握如何有效处理高清大图:Android-Universal-Image-Loader框架解析(一)基本使用

为什么要写这章 在最近的项目中,有一个高清大图片处理任务,自己尝试进行了一些封装,虽然使用起来还算顺利,但中间还是遇到一些槽点,如不当调用bitmap的recycle方法导致app crash,图片缓存策略设计不够合理,框架只能适应用于较少的任务…顾方才有了此系列 Android-Universal-Image-Loader(Android通过图片加载框架)基本使用 实现效果如下:   在...

yi_master的博客 636

Intellij IDEA 使用教程(一)Jdk安装和配置

一.JDK下载 这里下载的是Java SE 8u181 64位版本。可以根据自己电脑配置来选择不同版本。 官网下载JDK 二.安装JDK 双击运行jdk-8u181-windows-x64.exe安装程序 选择安装目录,然后点击下一步 等待安装 安装JRE,就是java的运行环境,可以安装在java目录下 等待安装 安装完成。点击关闭。 三.java环境变量配置 关于环境变量的配置,...

岁月不饶人,我亦未曾饶过岁月 4059

《ATF(TF-A)专题精讲》目录——146篇,完整覆盖整个ATF的官方文档

本文摘要介绍了Trusted Firmware-A (TF-A)项目的技术文档体系。主要内容包括:项目概述、组件解析(如ARM RAS/RME/CCA等安全技术)、系统设计(启动流程、中断管理、信任链等)、开发指南(构建环境、移植策略)、性能分析、平台支持(涵盖NXP、Marvell、Xilinx等主流芯片厂商)、开发流程规范以及安全通告(CVE漏洞分析)。文档体系全面覆盖了ARM安全固件的技术实现、硬件适配和开发实践,为开发者提供了从理论到实践的完整参考。

Linux内核架构师 1113

Universal-Image-Loader,android-Volley,Picasso、Fresco和Glide五大Android开源组件加载网络图片的优缺点比较(2)

总结:这个库有着对加载网络图片的吵详细配置。可以根据个人的喜欢,进行一些配置等等。并且可以实现图片下载过程的监听。且可以支持图片下载完成后,显示圆形或者圆角矩形的图片。4.Fresco关于 FrescoFacebook最近推出了一款用于Android应用中展示图片的强大图片库Fresco,它能够从网络、本地存储和本地资源中加载图片。而且,为了节省数据和CPU,它拥有三级缓存。Fresco 是一个强大的图片加载组件。Fresco 中设计有一个叫做 image pipeline 的模块。

2401_84545339的博客 512

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

bitmap 图片优化

最近除了忙着项目开发上的事情,还有就是准备我的毕业论文,有一小段时间没写博客了,今晚难得想总结一下,刚好又有一点时间,于是凑合着来一篇,好了,唠叨话不多说,直接入正题。从事Android移动端的开发以来,想必是经常要与内存问题打交道的,说到Android开发中遇到的内存问题,像Bitmap这种吃内存的大户稍微处理不当就很容易造成OOM,当然,目前已经有很多知名的开源图片加载框架,例如:ImageL

A1345g2354的博客 457

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Android Bitmap图片优化分析

原文地址:https://juejin.im/post/6844904166138069005 图片在移动开发中占据中举足轻重的地位,早期的android 应用页面Ui相对简单,但随着Android系统不断的升级发展, 界面元素越来越丰富,用户对体验要求越来越高,UI小姐姐们需要设计出精致的界面元素,其中不乏很多好看的图片,但是随着手机性能提升(分辨率,cpu主频,内存等),图片质量也越来越大,拍个照动不动就3M,4M,8M, 大家都知道,android 应用在创建进程时候,会分配一个指定的内存大小,准确的

u013750244的博客 920

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

基于STM32的智能倒车雷达-人体感应

本设计由STM32单片机核心板+OLED显示屏电路+超声波测距模块+语音播报模块+红外人体感应模块+蜂鸣器电路+蓝牙模块电路+按键电路+电源电路组成。采用OLED显示屏幕实时显示障碍物距离,后方是否有人,以及报警距离。可以按键设置报警距离,当小于设置阈值时,蜂鸣器报警;按键1为设置键,按键2为加一键,按键3为减一键。APP可发送指令:发送“A”:获取系统状态;发送“+”或“-”:调整倒车距离报警值;系统通过无线通信连接手机APP,手机APP实时显示距离信息,并且可以设置距离阈值;

MCUFANS123的博客 1280

1 JQ6500语音播报模块详解(STM32)

本节介绍下JQ6500语音播报模块的使用,基于的单片机是STM32F103RCT6。主要完成以下功能:1、制作一个JQ6500驱动程序2、通过按键进行切换上一曲、下一曲;增加音量,减小音量JQ6500 是一个提供串口的MP3芯片,完美的集成了MP3、WMV的硬解码。同时软件支持TF卡驱动,支持电脑直接更新spi flash的内容,支持FAT16、FAT32文件系统。通过简单的串口指令即可完成播放指定的音乐,以及如何播放音乐等功能,无需繁琐的底层操作,使用方便,稳定可靠是此款产品的最大特点。

qq_51776551的博客 1144

架构师学习--手写Glide之复用池

首先了解为什么需要复用池的设计?之前有说过,内存缓存采用LruCache缓存机制,在某个时刻系统会回收或者当我们手动回收一张内存中的图片时,就会将这张图片的内存加入到复用池中,这样当下一次申请图片内存的时候,收钱会从复用池中查找有没有合适的内存,有的话就会复用这块内存,没有的话就会重新开辟一块内存,这样做的好处就避免了内存的不断回收、申请而导致的内存抖动和内存碎片。 一、接口BitmapPool ...

qinbin2015的博客 529

运用BitmapFactory.Options来改善程序加载图片效率和避免内存溢出

Fields public Bitmap inBitmap If set, decode methods that take the Options object will attempt to reuse this bitmap when loading content. public int inDensity The pixel densi

hello_tree的专栏 2756

android BitmapFactory.Options参数介绍

android BitmapFactory.Options各个参数介绍

choha的博客 1791
上一篇: 彻底掌握如何有效处理高清大图:Android-Universal-Image-Loader框架解析(二)缓存
下一篇: 彻底掌握如何有效处理高清大图:Android-Universal-Image-Loader框架解析(四)URL全流程总述
yi_master
博客等级 码龄10年 283粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值