📄 user_main.c
字号:
/////////////////////////命名为user_main.c 文件 主程序
#define MapHeight 128 //图像的高
#define MapWidth 128 //图像的宽
#define Quality 75 //图像品质设置。请设置0~100之间的整数;0最低 图像质量最差
//100最高 图片质量最好;
#include "stdio.h"
#include "math.h"
#include "user_def.h"
#include "user_data.h"
#include "user_bmp.h"
#include "img_fdct_8x8.h"
#include "img_idct_8x8.h"
#include "user_ini_decode.h"
#include "user_ini_encode.h"
#include "user_huffman.h"
#include "user_dehuffman.h"
#pragma DATA_SECTION(pYnew,".bufferY") /*定义一个名为bufferY1的用户段 */
int pYnew[MapHeight*MapWidth]; /*该段保存变量 y */
#pragma DATA_SECTION(pUnew,".bufferU") /*定义一个名为bufferU的用户段 */
int pUnew[MapHeight*MapWidth/4]; /*该段保存变量 cb */
#pragma DATA_SECTION(pVnew,".bufferV") /*定义一个名为bufferV的用户段 */
int pVnew[MapHeight*MapWidth/4]; /*该段保存变量 cr */
#pragma DATA_SECTION(dataIMGE,".bufferIMGE") /*定义一个名为bufferV的用户段 */
YCC dataIMGE[64]; /*该段保存变量 cr */
#pragma DATA_SECTION(JPEGHUFFMAN_DATA,".bufferIMGE") //定义一个名为JPEGHUFFMAN_DATA的用户段
unsigned char JPEGHUFFMAN_DATA[MapHeight*MapWidth*2];
main()
{
int numWH ,k ,i,j,couW,couH,nData;
YCC outIMGE; //16*16 BMP MCU
BYTE *pBMPData;
short qy;
//为变量在内存中初始化为0;
memset(pYnew,0,MapHeight*MapWidth*sizeof(int));
memset(pUnew,0,MapHeight*MapWidth*sizeof(int)/4);
memset(pVnew,0,MapHeight*MapWidth*sizeof(int)/4);
memset(decode_bmpdata,0,MapHeight*WIDTHBYTES(MapWidth*24));
memset(dataIMGE,0,MapHeight*WIDTHBYTES(MapWidth*24)*sizeof(int));
memset(JPEGHUFFMAN_DATA,0,MapHeight*MapWidth*2*sizeof(char));
qy=Quality;
ini_Quality(qy); //根据选择的品质生成相应的量化表声明于USER_LIB.H文件
ini_jpeg_huf(); //初始化哈夫曼dc ac表
//对BMP图片进行分块16*16
pBMPData=bmpdata;
nData =WIDTHBYTES(MapWidth*24)-MapWidth*3; //图片的数据区宽度
for(j=0;j<MapHeight;j++)
{
for(k=0;k<MapWidth;k++)
{
couH=j%16;
couW=k%16;
numWH=j/16;
numWH*=8;
numWH+=k/16;
dataIMGE[numWH][couH][couW].Y=*(pBMPData);
dataIMGE[numWH][couH][couW].Cb=*(pBMPData+1);
dataIMGE[numWH][couH][couW].Cr=*(pBMPData+2);
pBMPData+=3;
}
pBMPData+=nData;
}
//开始进行图像编码处理
i=MapHeight*MapWidth/256;
for(j=0;j<i;j++){
read16(dataIMGE[j],outIMGE); //色度空间变换
//进行4:1:1采样;
divide(outIMGE,Y1,Y2,Y3,Y4,Cb,Cr); //分成8*8 块以下执行四次分别对Y4 Y3 Y2 Y1进行变换
//离散余弦变换和量化
FDCT_Q(Y1,qlum); //Y1 Y2 Y3 Y4在内存中是连续的 所以在进行DCT变换时
FDCT_Q_UV(Cb,qchr); //Cb Cr数组的存储空间是连续的 可以看成一个 [128]的数组
//经DCT变换的数据存储到pYnew pUnew pVnew
//save_YCbCr(Y1,Y2,Y3,Y4,Cb,Cr,j);
//进行哈夫曼(Huffman)编码 数据存放到 JPEGHUFFMAN_DATA 内
ProcessData(Y1,Cb,Cr);
}
//解码开始;
yDC=0;uDC=0;vDC=0;
for(j=0;j<i;j++)
{
// read_YCbCr(Y1,Y2,Y3,Y4,Cb,Cr,j);
DecompressionData(Y1,Cb,Cr);
////逆量化和离散余弦逆变换
IDCT_Q(Y1,qlum); //(同上)
IDCT_Q_UV(Cb,qchr);
save_decode_bmpdata(Y1,Y2,Y3,Y4,Cb,Cr,j); //保存(RGB图片)数据到 decode_bmpdata 以便察看
//察看decode_bmpdata指向的存储空间 就可以看到被压缩后的图片
}
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -