在对RGB
和YUV
有了一定的了解后,来看看Bitmap
。
一般设备(例如相机)采集的数据是RGB
或者YUV
等格式的,那么bitmap
又是什么呢?虽然一直在用它,但是真的了解它吗?
出处:https://baike.baidu.com/item/Bitmap
位图(Bitmap),又称栅格图(英语:Raster graphics)或点阵图,是使用像素阵列(Pixel-array/Dot-matrix点阵)来表示的图像。
编码方式:RGB,位图颜色的一种编码方法,用红、绿、蓝三原色的光学强度来表示一种颜色。这是最常见的位图编码方法,可以直接用于屏幕显示。
出处:Android编程权威指南
Bitmap是个简单对象,它只存储实际像素数据。也就是说,即使原始照片已压缩过,但存入Bitmap对象时,文件并不会同样压缩。因此,一张1600万像素24位的相机照片(存为JPG格式大约5MB),一旦载入Bitmap
对象,就会立即膨胀至48MB!
也就是说,通常我们的图片数据(如jpg
,jpg
本身就是代表压缩方式)都是压缩过的,一旦转换成bitmap
是会放大的。这也就解释了,为什么使用bitmap过程中经常容易造成内存泄漏之类的问题。
大致意思是bitmap
是一种图像,其常见编码方式是RGB
。但是并不能理解到底何为bitmap
。
找了几本计算机图形学的书籍,想了解何为bitmap
。
以下内容出自《计算机图形学(OpenGL版)第3版》和《计算机图形学 第4版》。
忽略掉《计算机图形学 第4版》中关于计算机图形硬件这一章的大部分描述(因为大部分无法理解),来看计算机图形软件这一章。
这段话简单来说,就是图形软件有2种:1.如windows自带的画图、PS、CAD等画图应用软件,不需要有代码基础就能使用的
专用图形软件
。2.GL、OpenGL等通用图形软件
,需程序员通过编写代码从而实现图形显示在输出设备上。
计算机绘制的图形是由输出图元组成,来看输出图元为光栅图像的情况。
假设计算机绘制出了一个如下所示的光栅图形(一个棋子),如下所示。
这个光栅图像,由多个
单元
(每个单元
被称为像素
,像素即为图像元素的简称)组成。光栅图像以数组的形式存储在计算机中,例如18x19的矩形数组存贮了一个光栅图像,那么这个数组即为
像素图
,或者位图
。这幅图,左边是光栅图像,右边是部分像素图的值,此图为灰度图像
,因此存储是数值是灰度。左上的那个像素
对应的数组中的数值就是2
。
一般大多数情况下我们使用的图片存储是RGB数值,有时候也会带上alpha通道的数据。
假设使用Bitmap.Config.ARGB_8888。ARGB_8888表示每个像素用32比特位表示,占4个字节,由4个8位组成,ARGB分量都是8位。
那么一个像素
对应的数值(数值是虚构的) 应如下所示。
A | R | G | B |
---|---|---|---|
11111111 | 00001111 | 00011111 | 00111111 |
以上涉及到的概念有:光栅图像,像素,位图,灰度图像,ARGB。
到这里,对于bitmap的概念应该有了一定的理解。后续的问题就是使用中如何避免OOM。基本上思路都是压缩处理后再使用。
Android 性能优化(五)之细说 Bitmap
BitmapFactory获取Bitmap图片以及解决OOM异常
Bitmap与OOM
Android 之 Bitmap
浅谈图片加载的三级缓存