前言:本来我是做电视应用的,但是因为公司要出手机,人员紧张,所以就抽调我去支援一下,谁叫俺是雷锋呢!大笑我做的一个功能就是处理手机中的应用ICON,处理无非就是美化一下,重新与底板进行合成和裁剪,用到了很多Bitmap的知识。本来之前一直想写一些关于Bitmap的博客,正好这是个机会,因此Bitmap那些事系列博客诞生了。这个系列我会把学习Bitmap的一些知识发布出来供大家参考和交流。
在手机中图片一般都是指Bitmap图片,为什么要说Bitmap呢?因为大家在开发应用的时候,都会使用一些图片来表现UI,用户也喜欢看图片,看文字获取信息太慢并且不直观,如果美工设计的好,看图片基本上不怎么看你的文字内容就知道你要表达什么,例如所有的购物网站都会编辑很多商品的配图来呈现给用户,由此可见图片在应用程序中的常见和重要。只要说到图片就不能离开如何避免OOM这个主题,因为在处理很多图片时很容易出现OOM,那么学习图片处理就显得尤为重要了,下面就让我们一步一步学习图片的相关知识。
Bitmap图片占用内存计算:
Bitmap图片在加载到内存的时候是按照:宽*高*像素点位数来计算的。你可以把图片看成是由width行、height列的矩阵组成,每一个矩阵元素代表一个像素点,每一个像素点都是1byte整数倍的数据,这个数据越大,表示的色彩就越丰富,图片的显示质量就越高。Bitmap中有一个枚举类Config用来配置图片的压缩格式,代表每个像素是用多大的数据来存储的,数值越大能够存储的颜色信息就越多,也就越丰富,显示效果也就越好。Config.ALPHA_8是1 byte,Config.RGB_565和Config.ARGB_4444都是2 bytes,Config.RGB_565没有Alpha值所以多用来配置没有透明度的图片,Config.ARGB_8888是4 bytes,一般图片都是按照这个来配置的。下面是获取配置的代码:
static int getBytesPerPixel(Config config) {
if (config == Config.ARGB_8888) {
return 4;
} else if (config == Config.RGB_565) {
return 2;
} else if (config == Config.ARGB_4444) {
return 2;
} else if (config == Config.ALPHA_8) {
return 1;
}
return 1;
}
使用图片你需要注意哪些:
1、android系统自身的问题。android系统给每一个应用分配了一定的内存空间,分配了多少要看厂家和机型,数值可以通过Runtime类获取,Runtime.getRuntime()获取实例,然后通过maxMemory()方法获取系统可为APP分配的最大内存,totalMemory() 获取APP当前所分配的内存heap空间大小,freeMemory()获取当前可用的内存,当被耗尽时会自动扩张,但是不会超过maxMemory。下图为google官网提供的不同分辨率下不同的dpi分配的最小内存;
2、需要多大的照片。很多图片其实在手机上显示的时候不需要完全把原图加载到内存中,比如我手机相机拍了一张照片是4208*3120的,加载到内存中占用的内存就是52M,这是很恐怖的,两张照片差不多就把你的app内存给耗光了。一般情况下你都需要对需要加载的图片进行处理,这个处理主要是减小图片尺寸,降低分辨率,比如你的控件显示就是100*100的大小,那你就要把图片缩小到100*100。
3、及时释放内存。安卓2.3.3(API级别10)之前,Bitmap像素数据和Bitmap对象是分开存储的,像素数据是存储在native memory中,对象存储在Dalvik heap中,native memory中的像素数据不是以一种可预见的方式释放,可能导致应用程序暂时超过其内存限制和崩溃,所以在Android2.3.3(API 10)之前你必须要调用recycle()方法来释放掉内存避免出现OOM,当然前提是确定这个bitmap不再使用,否则会出现 "Canvas: trying to use a recycled bitmap". 在Android3.0(API 11)之后,Bitmap的像素数据和Bitmap对象一起存储在Dalvik heap中,所以我们不用手动调用recycle()来释放Bitmap对象,内存的释放都交给垃圾回收器来做。
以上是学习Bitmap的一些基础知识和加载到手机内存中需要注意的事项,下一篇博客我会写如何更好的加载Bitmap,怎样省内存,怎样高效。谢谢大家的浏览,写的不好的地方和有任何疑问请留言或者更快的与我交流请添加:coder_online公众号,这里不仅有我的文章,还有我的小伙伴们的,各种技术分享,不妨你来看看,我们期待你的到来。也可以扫描下面的二维码,duang的一下就找到我们了。。。。。。。
分享到:
相关推荐
在Android开发中,Bitmap是用于表示图像数据的一种对象,它在内存中占用较大空间,因此在处理图片时,我们有时需要将其转换为byte数组(byte[]),以便于存储、传输或者在网络流中使用。这个过程涉及到图像数据的...
- `recycle()` 方法用于回收Bitmap占用的内存空间,将其标记为Dead状态,但调用此方法后不应再使用该Bitmap,否则可能导致`NullPointerException`。 - `isRecycled()` 返回Bitmap当前是否已被回收,即内存是否已...
由于Bitmap对象占用大量内存,因此在Android开发中,正确管理和使用Bitmap至关重要,以避免内存溢出和性能问题。 1. Bitmap的创建与加载 - 通过BitmapFactory类:BitmapFactory是Android提供的一个用于解码图像...
- **Picasso** 加载 Bitmap 默认使用 ARGB_8888 格式,这会导致内存占用比基准线高出近 8MB。 - **Glide** 加载 Bitmap 默认使用 RGB_565 格式,内存占用仅比基准线高出约 1MB。 理想的 ARGB_8888 格式的内存占用...
四、注意事项 - 考虑内存限制:虽然软引用有助于防止内存泄漏,但也要注意缓存大小,避免过多占用内存。 - 使用合适的图片格式和尺寸:加载原图可能导致内存溢出,可以根据需要进行缩放和格式转换。 - 错误处理:...
文件` main.java `很可能是包含具体实现这些操作的Java源代码,而` README.txt `可能包含了代码的使用说明或注意事项。在实际项目中,你应该仔细阅读` README.txt `以了解代码的工作方式和如何运行示例。 总之,...
6. 注意事项: - SVG在某些Android版本和设备上可能支持不佳,确保测试覆盖广泛的设备。 - SVG解析可能消耗较多CPU资源,尽量避免在主线程中进行。 - 考虑SVG的文件大小,过大可能会延长加载时间。 通过以上步骤...
1. **合理设置Bitmap配置**:在加载Bitmap时,根据需要调整Bitmap的配置(如缩放比例、颜色模式等),减少内存占用。 2. **使用内存分析工具**:Android Studio提供内存分析工具,可以帮助开发者检测内存泄漏和过度...
这些库已经内置了内存和磁盘缓存机制,以及图片尺寸调整等功能。只需简单调用库的方法,即可实现图片的异步加载和显示。 例如,使用Glide加载图片: ```java Glide.with(context) .load(imageUrl) .into...
### 三、注意事项 1. **内存管理**:在处理大量图片时,要注意内存管理,避免OOM(Out Of Memory)错误。 2. **缓存策略**:合理设置缓存策略,避免无限制的缓存消耗过多存储空间。 3. **网络状态检测**:在异步...
这是因为Android设备的内存资源有限,而图片作为数据量较大的资源之一,在加载、处理过程中极易占用过多内存,导致应用程序崩溃。特别是当应用需要处理高清图片或者大量图片时,这一问题更为突出。 #### 二、根本...
本文将基于几种成熟的开源框架,结合实际项目案例,探讨图片高效处理的方法和步骤,并分析各种处理方式的适用范围、优势及注意事项。 1. 图片加载库的选择 Android SDK虽然提供了基础的图片处理功能,但在面对大量...
3. **覆盖sizeOf()方法**: 根据Bitmap的宽度、高度和配置计算其占用的内存大小。 4. **添加Bitmap到缓存**: `lruCache.put(key, bitmap);` 5. **从缓存中获取Bitmap**: `Bitmap bitmap = (Bitmap) lruCache.get(key)...
五、注意事项 - 旋转可能会导致Bitmap大小增加,占用更多内存,因此在处理大图时要注意内存管理,避免OOM异常。 - 对于Exif信息的处理,可以使用ExifInterface类来获取和修改图片的旋转信息,避免不必要的实际像素...
- 图片的内存占用可以通过`Bitmap`的`computeByteSize()`方法计算。 - 考虑到不同设备的内存差异,动态计算缓存大小更为合理。 - `LruCache`仅适用于内存缓存,对于持久化的缓存,如磁盘缓存,应考虑使用`...
本文将深入探讨Android图片压缩的原理、方法以及实践中的注意事项。 首先,了解为什么要进行图片压缩。在Android设备上,未经过压缩的大尺寸图片会占用大量内存,可能导致应用加载速度变慢,甚至触发内存溢出(Out ...