1. 正向分割为若干8*8 块
下面的程序为通用程序,可以分割任意块
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include //v4l2 头文件
#include
#include
#include
int main(void){
char i[]={1, 2, 3, 4, 5, 6, 7, 8,
9,10,11,12, 13,14,15,16,
17,18,19,20, 21,22,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,58,59,60, 61,62,63,64
};
int width=8; //被分割数据宽度
int heigth=8; //被分割数据高度
int fwidth=4; //分割块的宽度 分割成4×2块
int fheigth=2; //分割块的高度
char o[width*heigth]; //分割后的数据
int t=0;
for(int c=0;c
2. 8*8 块逆向 转化为帧
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include //v4l2 头文件
#include
#include
#include
int main(void){
/* char i[]={1, 2, 3, 4, 5, 6, 7, 8,
9,10,11,12, 13,14,15,16,
17,18,19,20, 21,22,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,58,59,60, 61,62,63,64
};*/
char io[]={
1, 2, 3, 4,
9, 10, 11, 12,
17, 18, 19, 20,
25, 26, 27, 28,
5, 6, 7, 8,
13, 14, 15, 16,
21, 22, 23, 24,
29, 30, 31, 32,
33, 34, 35, 36,
41, 42, 43, 44,
49, 50, 51, 52,
57, 58, 59, 60,
37, 38, 39, 40,
45, 46, 47, 48,
53, 54, 55, 56,
61, 62, 63, 64
};
int width=8; //被分割数据宽度
int heigth=8; //被分割数据高度
int fwidth=4; //分割块的宽度
int fheigth=4; //分割块的高度
/*
char o[width*heigth]; //分割后的数据
int t=0;
for(int c=0;c
实话头都绕晕了,看能不能再想一个好理解的方法。查表法简单,但数据大了就不实用了,如果要程序生成大数据的表,感觉又多了一个环节。而且也不容易
但Z 型排列可以用查表法。
3.用4×4块模拟生成一维的帧
//模拟4×4的块横向拼接成一个16×4的一个大块
下面的拼接思路为:先确定要拼接的输出数组每行总宽度width, 再确定这个总宽度要几个被转换的块,再取出每一个块的第一行组成输出数组的第一行,取每个块的第二行组成输出数组的第二行,直到fheigth结束。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include //v4l2 头文件
#include
#include
#include
int main(void){
/* char i[]={1, 2,3, 4, 5, 6, 7, 8,
9,10,11,12, 13,14,15,16,
17,18,19,20, 21,22,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,58,59,60, 61,62,63,64
};
*/
char i1[]={ //模拟4×4的块横向拼接成一个16×4的一个大块
1, 2,3, 4,
9,10,11,12,
17,18,19,20,
25,26,27,28,
};
char (*p1)[4]=(char (*)[4])i1;
char i2[]={
5, 6, 7, 8,
13,14,15,16,
21,22,23,24,
29,30,31,32,
};
char (*p2)[4]=(char (*)[4])i2;
char i3[]={
33,34,35,36,
41,42,43,44,
49,50,51,52,
57,58,59,60,
};
char (*p3)[4]=(char (*)[4])i3;
char i4[]={
37,38,39,40,
45,46,47,48,
53,54,55,56,
61,62,63,64
};
char (*p4)[4]=(char (*)[4])i4;
char i[64]; //4个块合成在一起,相当于逆向余弦后的8×8数据合成一数组
memcpy(i,i1,16);
memcpy(&i[16],i2,16);
memcpy(&i[32],i3,16);
memcpy(&i[48],i4,16);
int n=4;
char o[64]; //正常的帧排列
int fwidth=4;
int fheigth=4;
int width=n*fwidth;
int heigth=4;
char (*po)[width]=(char (*)[width])o;
char (*ii)[fheigth][fwidth]=(char (*)[fheigth][fwidth])i; //把要转换的数据转成n个fwidth*fheigth的块,用n的id来代表这些块
//--------------------------------------------------
for(int a=0;a