⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 user_main.c

📁 这是我做的毕业设计
💻 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 + -