目前在手持设备上,Raw Sensor吐出的数据通常都是RAW10,即一个像素用10 bit来存储,下面经过用位域的方式来简单的对两块RAW10数据进行相加运算,以此来达到像素叠加的效果。code
typedef unsigned long long MUINT64; typedef unsigned int MUINT32; typedef unsigned char MUINT8; struct pixel16 { MUINT64 p1 : 10; MUINT64 p2 : 10; MUINT64 p3 : 10; MUINT64 p4 : 10; MUINT64 p5 : 10; MUINT64 p6 : 10; }; struct pixel78 { MUINT32 pad : 4; MUINT32 p7 : 10; MUINT32 p8 : 10; }; void composePixel(MUINT8 *buf1, MUINT8 buf2) { MUINT8 pixel[8] = { 0 }; ... pixel[0] = ((struct pixel16 *) buf1)->p1 + ((struct pixel16 *) buf2)->p1; pixel[1] = ((struct pixel16 *) buf1)->p2 + ((struct pixel16 *) buf2)->p2; pixel[2] = ((struct pixel16 *) buf1)->p3 + ((struct pixel16 *) buf2)->p3; pixel[3] = ((struct pixel16 *) buf1)->p4 + ((struct pixel16 *) buf2)->p4; pixel[4] = ((struct pixel16 *) buf1)->p5 + ((struct pixel16 *) buf2)->p5; pixel[5] = ((struct pixel16 *) buf1)->p6 + ((struct pixel16 *) buf2)->p6; pixel[6] = ((struct pixel78 *) (buf1 + 7))->p7 + ((struct pixel78 *) (buf2 + 7))->p7; pixel[7] = ((struct pixel78 *) (buf1 + 7))->p8 + ((struct pixel78 *) (buf2 + 7))->p8; ... }
仅仅选取了 0 号字节单元到7 号字节单元部分运算。内存
数据在内存中是连续存放的,因此定义两个pixel16和pixel78结构体,方便从内存中取出数据,而后解析为对应的像素。it
经过上述代码可知,class
[0... 59] --- pixel1~pixel6 [60...80] --- pixel7~pixel7, [56...59] --- pad
即 第0号字节单元的 bit0 到第7号字节单元的bit59,就是pixel 1 ~pixel 6,一共60 bit(6个像素)数据
而后从第7号字节单元开始取数据,但第7号字节单元的bit56... bit59 一个四位数据是pixel 6的后四位数据,所以用pad来占位。从 第7号单元的bit60...bit 80为pixel 7 和pixel 8的数据。co
则能够很方便的将数据从buf中取出,而后对单个像素进行处理运算。结构体