c 把6*10 的char 数组扩充到8*12, 为图像帧分隔成8*8准备
此程序为扩充的思路:
1.补新与旧末尾差的字节
2.复制旧n-1行到新,不够补数
3.旧最后一行一个一个读到新。
为什么不把旧数据逐个读入新,而是采用以行为单位读,我想这样效率高些。
在编程中发现,因为摄像头如果是输出的yuv信号,每4个yuv字节对应2个像素点。厂家规定的摄像头分辨率的宽度与高度X2必定是8的倍数。所以要补数也是只补yuv文件末尾的空字节。真正要补数的是U,V两个色差信号。假如用的是yuv422, 因为如果是取8*8的yuv信号数据,含有8个Y,4个U,4个V,当对U,V 信号8*8余弦变换时,就必须补4列0。
所以就解释了屏幕分辫率乘以2后,如果不能被8整除,图像必定是斜的,所以要微调宽度。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <string.h>
#include <unistd.h>
#include <linux/fb.h>
#include <stdlib.h>
#include <math.h>
#define PI 3.141593
int main(void){
char i[]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
10,11,12,13,14,15,16,17,18,19,
20,21,21,23,24,25,26,27,28,29,
30,31,32,33,34,35,36,37,38,39,
40,41,42,43,44,45,46,47,48,49,
50,51,52,53,54,55,56,57
};
char (*p)[10]=(char (*)[10])i;
//6*8 扩大到8*12
//补新与旧末尾的字节
//复制旧n-1行到新,不够补数
//旧最后一行一个一个读如新,不够补数
char o[8][12]={};
char *y=(char *)o;
//补新与旧末尾的字节
//复制旧n-1行到新,不够补数
//旧最后一行一个一个读如新,不够补数
int J_M=10; //旧每行的列数
int X_M=12; //新每行的列数
memset(&y[57],1,(96-57)); //补新末尾差为1
int h=sizeof(i)/J_M;
for(int a=0;a<h;a++){
memcpy(&(o[a][0]),&(p[a][0]),J_M); //行复制就数据到新
memset(&(o[a][J_M]),1,X_M-J_M); //每行不够补1
}
memcpy(&(o[h][0]),&(p[h][0]),sizeof(i)-h*J_M); //复制旧最后一行到新
for(int a=0;a<8;a++){
for(int b=0;b<12;b++){
printf("%d, ",o[a][b]);
}
puts("");
}
return 0;
}