三星S308内屏是16位65536色屏幕,跟T408/T508一样都是r5g6b5格式的BMP颜色范围,大部分图像还采用了压缩格式。在把一幅图像导入到S308内屏时,需要把图像数据转换为r5g6b5格式再进行压缩。关于图像的r5g6b5格式见http://www.blueshow.net/vbb/showthr...p;threadid=2036
,这里仅需注意r5g6b5格式是用两个字节表示一个像素。以下讨论是针对r5g6b5图像数据而言。
(一)压缩算法简介
S308内屏图像压缩采用了两种算法:LZW与RLE。
1、LZW(Lempel-Ziv-Welch):LZW是一种基于字典算法的压缩方法,其主要思想为:用索引号表示一个单词。在图像压缩中,可以把一个经常出现的像素表示为一个索引信息,该像素颜色进入调色板,这样按索引就可以查找到该像素的颜色。一般地,索引总是比颜色所占空间要小,用索引替代颜色表示像素就实现了压缩。
2、RLE(行程长度编码,也叫游长编码):游长编码利用了图像中的重复像素值,使用一个像素代表具有相同值的一连续像素串,用一整数代表这个串的长度。在实际应用中,这种方法并非总能压缩数据。对于那些具有足够多的连续像素串的图像而言,这种方法可以压缩,然而对那些在图像局部区域像素值经常发生变化的图像,这种方法反而会增加大小。
(二)压缩图像数据编码
像素数据流从图像左上角至右下角按行进行。一幅压缩的图像编码由三部分组成:头部、调色板、及像素数据组成。以下叙述中各变量均为一个字节。
1、头部:09 S,S为调色板大小,S<128,调色板最多容纳127种颜色。
2、调色板:紧跟在头部之后,每两个字节表示一种颜色,为r5g6b5格式。调色板占用空间小于256个字节。调色板编号从0开始,索引为X的像素颜色是从调色板开始2X字节后的两个字节。
3、像素数据:紧跟在调色板之后,基本方式是用像素数量+像素值表示像素串。注意调色板不超过127色,这样调色板可能无法容纳一幅图像所包括的的全部颜色,所以像素值可能是像素颜色(2字节),也可能是像素索引(1字节)。按照颜色是否在调色板中及像素是否连续相同,可以把像素分为四种串,对这四种像素串的标识则隐含在像素数量字节中。具体编码规则如下:
设N表示像素数量,X为颜色索引,LH为像素两字节的颜色值。则:
◆ N LH[1] LH[2] ... LH[N],0<N<64:表示颜色为LH[1]、LH[2]...LH[N]的N个像素,这些像素不在调色板中。
◆ N X[1] X[2] ... X[N-64],64<N<128 :表示索引为X[1]、X[2]...X[N-128]的N-128个像素。
◆ N LH,128<N<192:表示颜色为LH的连续N-128个相同像素,LH色不在调色板中。
◆ N X,192<N<256:表示索引为X的连续N-192个相同像素。
这里用索引表示像素对应的是LZW,相同连续像素串表示方法对应的是RLE。
另外,图像在存储时必须保证从偶数地址开始,因此在头部前面根据情况可能需要添加一个字节的00。
(三)压缩特点
从图像数据编码可以看出S308内屏图像压缩有以下特点:
1、无损性:LZW和RLE都是无损压缩,图像在压缩前和解压缩后完全一样,不会有一位的差错,完整地保持了16位图像的特点。
2、逐行线性:RLE采用的是逐行线性压缩,压缩是针对水平线而言,图像在水平方向上连续相同像素串越长越多,压缩率就越大。如果图像中没有足够多的这种像素串,这种方法反而会增大图像。
3、LZW中,索引比颜色少占用一个字节的空间,用索引代替颜色表示像素能够减小图像。S308限定了调色板大小不超过127,颜色超出调色板范围的像素,将直接用颜色值而不是索引表示。这样如果图像的颜色数量比较少,LZW就能够有效地压缩图像。