本发明属于图片处理技术领域,尤其涉及一种加载图片资源的方法及装置。
背景技术:
在android开发的过程中,几乎所有的应用都离不开图片的加载。
现有技术中,一般是将图片直接加载进内存然后从内存中再获取到图片的信息展示到屏幕上,这种方法对于比较小的图片是可以的。但是如果按照上述方法去加载一张大的图片,内存中的图片大小会超过堆内存的总大小,导致系统无法一次性分配这么多内存,进而导致出现内存溢出。
基于此,本发明提供一种加载图片资源的方法及装置,以解决现有技术中的上述问题。
技术实现要素:
针对现有技术存在的问题,本发明实施例提供了一种加载图片资源的方法及装置,用于解决现有技术中在加载大内存的图片时,由于内存中的图片大小会超过堆内存的空间,导致内存溢出的技术问题。
本发明提供一种加载图片资源的方法,所述方法包括:
获取待加载图片的尺寸;
获取系统剩余内存量及内存总量,根据所述剩余内存量及所述内存总量确定缓存空间;
根据所述缓存空间的容量截取所述待加载图片,并将截取后的所述待加载图片的当前信息加载至所述缓存空间中;
获取手指在所述屏幕上的当前滑动点,当确定所述当前滑动点超出截取后的所述待加载图片的边界时,以所述当前滑动点为第一中心点将所述待加载图片的剩余信息加载至所述缓存空间中。
上述方案中,所述根据所述剩余内存量及内存总量确定缓存空间,包括:
根据所述剩余内存量及内存总量确定所述内存的剩余率;
获取屏幕尺寸,根据所述屏幕尺寸确定全屏界面所需的内存量;
根据公式c=b/a确定所述缓存空间c;其中,所述a为所述剩余率,所述b为全屏界面所需的内存量。
上述方案中,所述根据所述缓存空间的容量截取所述待加载图片,包括:
确定所述待加载图片的中心位置,将所述中心位置设置为第二中心点;
根据屏幕尺寸确定所述待加载图片的第一截取区域及宽高比;
以所述第二中心点为中心,基于所述第一截取区域及所述宽高比利用截取算法decoderegion对所述待加载图片进行截取。
上述方案中,将截取后的所述待加载图片加载至所述缓存空间中后,还包括:加载完成后返回第一位图对像,将所述第一位图对像设置在显示背景中,显示所述待加载图片的当前信息。
上述方案中,以当前滑动点为第一中心点加载所述待加载图片的剩余信息后,还包括:加载完成后返回第二位图对像,将所述第二位图对像设置在显示背景中,刷新并显示所述待加载图片的剩余信息。
本发明还提供一种加载图片资源的装置,所述装置包括:
获取单元,用于获取待加载图片的尺寸、系统剩余内存量及内存总量及手指在所述屏幕上的当前滑动点;
确定单元,用于根据所述剩余内存量及所述内存总量确定缓存空间;
加载单元,用于根据所述缓存空间的容量截取所述待加载图片,并将截取后的所述待加载图片的当前信息加载至所述缓存空间中;
当确定所述当前滑动点超出截取后的所述待加载图片的边界时,以所述当前滑动点为第一中心点将所述待加载图片的剩余信息加载至所述缓存空间中。
上述方案中,所述获取单元还用于:获取屏幕尺寸;所述确定单元具体用于:
根据所述剩余内存量及所述内存总量确定所述内存的剩余率;
根据所述屏幕尺寸确定全屏界面所需的内存量;
根据公式c=b/a确定所述缓存空间c;其中,所述a为所述剩余率,所述b为全屏界面所需的内存量。
上述方案中,所述加载单元具体用于:
确定所述待加载图片的中心位置,将所述中心位置设置为第二中心点;
根据屏幕尺寸确定所述待加载图片的第一截取区域及宽高比;
以所述第二中心点为中心,基于所述第一截取区域及所述宽高比利用截取算法decoderegion对所述待加载图片进行截取。
上述方案中,所述装置还包括:显示单元,所述显示单元用于将截取后的所述待加载图片加载至所述缓存空间中后,返回第一位图对像,将所述第一位图对像设置在显示背景中,显示所述待加载图片的当前信息。
上述方案中,显示单元还用于:以当前滑动点为第一中心点加载所述待加载图片的剩余信息后返回第二位图对像,将所述第二位图对像设置在显示背景中,刷新并显示所述待加载图片的剩余信息。
本发明提供了一种加载图片资源的方法及装置,所述方法包括:获取待加载图片的尺寸;获取系统剩余内存量及内存总量,根据所述剩余内存量及内存总量确定缓存空间;根据所述缓存空间的容量截取所述待加载图片,并将截取后的所述待加载图片的当前信息加载至所述缓存空间中;获取手指在所述屏幕上的当前滑动点,当确定所述当前滑动点大于截取后的所述待加载图片的边界时,以所述当前滑动点为第一中心点将所述待加载图片的剩余信息加载至所述缓存空间中;如此,根据所述剩余内存量及内存总量确定出一个缓存空间,先根据缓存空间的容量将待加载图片信息的一部分进行加载;当手指滑动到截取后的待加载图片的边界时,再重新根据缓存空间的容量加载图片信息的剩余部分,这样通过分片加载的方式将待加载图片加载至缓存空间,有效解决了因超大图片内存过大导致内存溢出的问题。
附图说明
图1为本发明实施例一提供的加载图片资源的方法流程示意图;
图2为本发明实施例一提供的加载图片资源的装置结构示意图。
具体实施方式
为了在加载超大图片时,避免出现因图片内存过大导致内存溢出的问题,本发明提供了一种加载图片资源的方法及装置,所述方法包括:获取待加载图片的尺寸及屏幕尺寸;获取系统剩余内存量及内存总量,根据所述剩余内存量及内存总量确定缓存空间;根据所述缓存空间的容量截取所述待加载图片,并将截取后的所述待加载图片的当前信息加载至所述缓存空间中;获取手指在所述屏幕上的当前滑动点,当确定所述当前滑动点超出截取后的所述待加载图片的边界时,以所述当前滑动点为第一中心点将所述待加载图片的剩余信息加载至所述缓存空间中。
下面通过附图及具体实施例对本发明的技术方案做进一步的详细说明。
实施例一
本实施例提供一种加载图片资源的方法,如图1所示,所述方法包括:
s101,获取待加载图片的尺寸。
本步骤中,首先需获取到待加载图片的原始尺寸及显示待加载图片的屏幕尺寸,所述屏幕可以是安装有安卓系统的任一智能终端的屏幕,比如:智能手机、平板及穿戴设备等。所述待加载图片一般是超大内存的图片,所述待加载图片的内存至少超过20m。
这里,所述图片文件的组成通常都是由头部描述信息和实际内容信息组成的。那么在获取待加载图片的尺寸时,具体可以如下:
首先通过读取待加载图片的后缀名确定该图片的类型,然后基于所述类型调用bitmapfactory.decodestream方法获取图片的头部信息,并将头部信息存储到bitmapfactory.options对象中。最后从bitmapfactory.options中分别调用outwidth和outheight方法,来分别获取到了图片的宽度和高度。为了方便描述这里将获取的图片的宽标记为picwidth、高标记为picheight。
获取到图片的原始尺寸后,还需获取显示待加载图片的屏幕尺寸,以能以下流程处理图片时确定所述屏幕可以展现的尺寸。
具体是通过调用系统提供的上下文context调用getsystemservice方法获取到系统的窗口管理类windowmanager。在通过窗口管理类中的getwidth()方法获取当前屏幕的宽度,利用getheight()方法来获取到当前屏幕的高度信息。为了方便,将屏幕的宽度标记为screenwidth,将高度标记为和screenheight。
s102,获取系统剩余内存量及内存总量,根据所述剩余内存量及所述内存总量确定缓存空间。
获取到待加载图片的原始尺寸及屏幕尺寸后,还需获取到系统剩余内存量及所述内存总量;这里,是通过系统上下文context调用getsystemservice方法来获取到系统的界面管理对象activitymanager。然后通过界面管理对象调用其中的getmemoryinfo对象来获取到系统中的内存描述对象memoryinfo。然后再从memoryinfo对象中调用availmem方法获取到所述系统的剩余内存量;利用totalmem方法获取到系统的内存总量。为了方便描述,将剩余内存量标记为availmem,将内存总量标记为totalmem。
获取到剩余内存量及内存总量后,再根据所述剩余内存量及内存总量确定一个缓存空间。
具体地,根据所述剩余内存量及内存总量确定所述内存的剩余率a,如公式(1)所示:
a=availmem/totalmem(1)
公式(1)中,所述availmem为内存剩余量,所述totalmem为内存总量。
根据所述屏幕尺寸确定全屏界面所需的内存量,如公式(2)所示:
b=screenwidth*screenheight(2)
公式(2)中,所述screenwidth为所述屏幕的宽度信息,所述screenheight为所述屏幕的高度信息。
根据公式(3)确定所述缓存空间c;
c=b/a(3)
其中,公式(3)中,所述a为所述剩余率,所述b为全屏界面所需的内存量。
这样就计算出缓存空间的容量了,需要说明的是,缓存空间的容量是根据内存剩余量动态调整的,内存剩余量越大,缓存空间的容量就越大;内存剩余量越小,缓存空间的容量越小。
s103,根据所述缓存空间的容量截取所述待加载图片,并将截取后的所述待加载图片的当前信息加载至所述缓存空间中。
本步骤中,确定出缓存空间的容量后,根据所述缓存空间的容量截取所述待加载图片,并将截取后的所述待加载图片的当前信息加载至所述缓存空间中。
具体地,首先确定所述待加载图片的中心位置,将所述中心位置设置为第二中心点;所述第二中心点为picwidth/2和picheight/2的交点处。
然后根据所述屏幕尺寸确定所述待加载图片的第一截取区域及宽高比;所述宽高比应和所述屏幕的宽高比保持一致。
最后以所述第二中心点为中心,基于所述第一截取区域及所述宽高比利用截取算法decoderegion对所述待加载图片进行截取。当对所述待加载图片截取后,将截取后的当前信息加载至所述缓存空间中,加载完成后返回第一位图对像,将所述第一位图对像bitmap设置在显示背景中,以能显示所述待加载图片的当前信息。
这样,在屏幕上就可以显示待加载图片的一部分信息。
s104,获取手指在所述屏幕上的当前滑动点,当确定所述当前滑动点超出截取后的所述待加载图片的边界时,以所述当前滑动点为第一中心点将所述待加载图片的剩余信息加载至所述缓存空间中。
本步骤中,当有手势在屏幕上滑动来查看待加载图片的剩余信息时,通过监听系统的滑动事件来获取手指在所述屏幕上的当前滑动点,当确定所述当前滑动点超出所述截取后的待加载图片的边界时,以当前滑动点(即缓存空间的边界线与手指按在屏幕上的交点)为第一中心点将所述待加载图片的剩余信息加载至所述缓存空间中,这样就可以将待加载图片的剩余信息加载至缓存空间中。
加载完成后返回第二位图对像,将所述第二位图对像设置在显示背景中,刷新并显示所述待加载图片的剩余信息。这样通过分片加载的方式来加载待加载图片就避免出现内存溢出的问题,并且这种局部加载显示的方法也避免出现了由于有损压缩的方式加载时导致图片的问题。
这里,具体地是通过调用系统的invalidate方法来将缓存空间的待加载图片的剩余信息刷新至屏幕上。
实施例二
相应于实施例一,本实施例提供一种加载图片资源的装置,如图2所示,所述装置包括:获取单元21、确定单元22、加载单元23及显示单元24;其中,
所述获取单元21需获取到待加载图片的原始尺寸及显示待加载图片的屏幕尺寸,所述屏幕可以是安装有安卓系统的任一智能终端的屏幕,比如:智能手机、平板及穿戴设备等。所述待加载图片一般是超大内存的图片,所述待加载图片的内存至少超过20m。
这里,所述图片文件的组成通常都是由头部描述信息和实际内容信息组成的。那么在获取待加载图片的尺寸时,具体可以如下:
所述获取单元21首先通过读取待加载图片的后缀名确定该图片的类型,然后基于所述类型调用bitmapfactory.decodestream方法获取图片的头部信息,并将头部信息存储到bitmapfactory.options对象中。最后从bitmapfactory.options中分别调用outwidth和outheight方法,来分别获取到了图片的宽度和高度。为了方便描述这里将获取的图片的宽标记为picwidth、高标记为picheight。
获取到图片的原始尺寸后,所述获取单元21还需获取显示待加载图片的屏幕尺寸,以能以下流程处理图片时确定所述屏幕可以展现的尺寸。
所述获取单元21具体是通过调用系统提供的上下文context调用getsystemservice方法获取到系统的窗口管理类windowmanager。在通过窗口管理类中的getwidth()方法获取当前屏幕的宽度,利用getheight()方法来获取到当前屏幕的高度信息。为了方便,将屏幕的宽度标记为screenwidth,将高度标记为和screenheight。
所述获取单元21获取到待加载图片的原始尺寸及屏幕尺寸后,还需获取到系统剩余内存量及内存总量;这里,是通过系统上下文context调用getsystemservice方法来获取到系统的界面管理对象activitymanager。然后通过界面管理对象调用其中的getmemoryinfo对象来获取到系统中的内存描述对象memoryinfo。然后再从memoryinfo对象中调用availmem方法获取到所述系统的剩余内存量;利用totalmem方法获取到系统的内存总量。为了方便描述,将剩余内存量标记为availmem,将内存总量标记为totalmem。
所述获取单元21获取到剩余内存量及内存总量后,所述确定单元22用于根据所述剩余内存量及内存总量确定一个缓存空间。
具体地,根据所述剩余内存量及内存总量确定所述内存的剩余率a,如公式(1)所示:
a=availmem/totalmem(1)
公式(1)中,所述availmem为内存剩余量,所述totalmem为内存总量。
根据所述屏幕尺寸确定全屏界面所需的内存量,如公式(2)所示:
b=screenwidth*screenheight(2)
公式(2)中,所述screenwidth为所述屏幕的宽度信息,所述screenheight为所述屏幕的高度信息。
根据公式(3)确定所述缓存空间c;
c=b/a(3)
其中,公式(3)中,所述a为所述剩余率,所述b为全屏界面所需的内存量。
这样所述确定单元22就计算出缓存空间的容量了,需要说明的是,缓存空间的容量是根据内存剩余量动态调整的,内存剩余量越大,缓存空间的容量就越大;内存剩余量越小,缓存空间的容量越小。
确定出缓存空间的容量后,所述加载单元23根据所述缓存空间的容量截取所述待加载图片,并将截取后的所述待加载图片的当前信息加载至所述缓存空间中。
具体地,首先所述加载单元23确定所述待加载图片的中心位置,将所述中心位置设置为第二中心点;所述第二中心点为picwidth/2和picheight/2的交点处。
然后根据所述屏幕尺寸确定所述待加载图片的第一截取区域及宽高比;所述宽高比应和所述屏幕的宽高比保持一致。
最后以所述第二中心点为中心,基于所述第一截取区域及所述宽高比利用截取算法decoderegion对所述待加载图片进行截取。当对所述待加载图片截取后,将截取后的当前信息加载至所述缓存空间中,加载完成后返回第一位图对像,所述显示单元24将所述第一位图对像bitmap设置在显示背景中,以能显示所述待加载图片的当前信息。
这样,所述显示单元24在屏幕上就可以显示待加载图片的一部分信息。
当有手势在屏幕上滑动来查看待加载图片的剩余信息时,所述加载单元23通过监听系统的滑动事件来获取手指在所述屏幕上的当前滑动点,当确定所述当前滑动点超出截取后的所述待加载图片的边界时,以当前滑动点(即缓存空间的边界线与手指按在屏幕上的交点)为第一中心点将所述待加载图片的剩余信息加载至所述缓存空间中,这样就可以将待加载图片的剩余信息加载至缓存空间中。
所述加载单元23加载完成后返回第二位图对像,所述显示单元24将所述第二位图对像设置在显示背景中,刷新并显示所述待加载图片的剩余信息。这样通过分片加载的方式来加载待加载图片就避免出现内存溢出的问题,并且这种局部加载显示的方法也避免出现了由于有损压缩的方式加载时导致图片的问题。
这里,所述显示单元24具体地是通过调用系统的invalidate方法来将缓存空间的待加载图片的剩余信息刷新至屏幕上。
本发明实施例提供的加载图片资源的方法及装置能带来的有益效果至少是:
本发明提供了一种加载图片资源的方法及装置,所述方法包括:获取待加载图片的尺寸;获取系统剩余内存量及内存总量,根据所述剩余内存量及内存总量确定缓存空间;根据所述缓存空间的容量截取所述待加载图片,并将截取后的所述待加载图片的当前信息加载至所述缓存空间中;获取手指在所述屏幕上的当前滑动点,当确定所述当前滑动点超出所述截取后的所述待加载图片的边界时,以当前滑动点为第一中心点将所述待加载图片的剩余信息加载至所述缓存空间中;如此,根据所述剩余内存量及内存总量确定出一个缓存空间,先根据缓存空间的容量将待加载图片信息的一部分进行加载;当手指滑动到截取后的所述待加载图片的边界时,再重新根据缓存空间的容量加载图片信息的剩余部分,这样通过分片加载的方式将待加载图片加载至缓存空间,有效解决了因超大图片内存过大导致内存溢出的问题。并且分片加载后进行分片显示,这种动态的局部显示方法避免了因有损压缩再加载显示造成的图片失真问题。
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。