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

📄 user_ini_encode.h

📁 这是我做的毕业设计
💻 H
字号:


extern int  pYnew[MapHeight*MapWidth];  
extern int  pUnew[MapHeight*MapWidth/4];   
extern int  pVnew[MapHeight*MapWidth/4];
extern unsigned char JPEGHUFFMAN_DATA[MapHeight*MapWidth*2];
extern volatile unsigned int CodeLen;
    
void ini_Quality(int Qy)      //根据选择的品质生成相应的量化表;
	{
		//对量化表进行处理
		int i,q;
		if(Qy<=0)
			q=1;
		else{ 
			if(Qy>100)
				q=100;
			else
				q=Qy;
			}
		
		if(q<50)
			q=5000/q;
		else 
			q=200-q*2;
		for(i=0;i<64;i++)
		{
			qchr[i]=(short)(qchr[i]*q/100);
			qlum[i]=(short)(qlum[i]*q/100);
		}

	}

//////////////////离散余弦变换
//   *source)[8]  为要进行离散余弦变换的矩阵
//   *q           为亮度 量化表    
//   功能:对进行完成DCT变换后的数据进行量化
void FDCT_Q(short (*source)[8],short *q)
{
	 int j;
	 short *psource;
	 psource=(short*)source;
	 IMG_fdct_8x8(psource,4);    //进行dct 变换
	 	/*************开始进行量化****************/
	 	for(j=0;j<64;j++){
		 		psource[j]=(short)(psource[j]/q[j]);		//	Y1
		 		psource[j+64]=(short)(psource[j+64]/q[j]);  //	Y2
		 		psource[j+128]=(short)(psource[j+128]/q[j]);//	Y3
		 		psource[j+192]=(short)(psource[j+192]/q[j]);//	Y4
	 	}	
} 
//   *q           为色度 量化表    
void FDCT_Q_UV(short (*source)[8],short *q)
{
	 int j;
	 short *psource;
	 psource=(short*)source;
	 IMG_fdct_8x8(psource,2);    //进行dct 变换
	 	/*************开始进行量化****************/
	 	for(j=0;j<64;j++){
		 		psource[j]=(short)(psource[j]/q[j]);        // Cb
		 		psource[j+64]=(short)(psource[j+64]/q[j]);  // Cr
	 	}	
} 	
	
void save_YCbCr(short (*s1)[8],short (*s2)[8],short (*s3)[8],short (*s4)[8],short (*sCb)[8],short (*sCr)[8],short j)
{
	short m,n,n1,n2,n3,n4,*py1,*py2,*py3,*py4,*pcb,*pcr;
	n=j*64;
	n1=n*4;
	n2=n1+64;
	n3=n2+64;
	n4=n3+64;
	
	pcb=(short*)sCb;
	pcr=(short*)sCr;
	py1=(short*)s1;
	py2=(short*)s2;
	py3=(short*)s3;
	py4=(short*)s4;
	
	for(m=0;m<64;m++){
		pVnew[n+m]=*(pcr+m);
		pUnew[n+m]=*(pcb+m);
		pYnew[n1+m]=*(py1+m);
		pYnew[n2+m]=*(py2+m);
		pYnew[n3+m]=*(py3+m);
		pYnew[n4+m]=*(py4+m);
	}
	
}

////////////2.1色度空间变换
 void read16(lastblk (*tempBGR)[16],lastblk (*out_Image)[16])
	 {	int i,j,k,l;
	 	int pY1,pY2,pY3,pCb1,pCb2,pCb3,pCr1,pCr2,pCr3;
	 	long pY,pCb,pCr;
	 	
	 	pY1=2990;  pY2=-1687;  pY3=5000;
	 	pCb1=5870; pCb2=-3313; pCb3=-4187;
	 	pCr1=1140; pCr2=5000;  pCr3=-813;
	 	
	  	for(i=0;i<16;i++)
	  	{
	    	for(j=0;j<16;j++)
				{
				k=i%i;
				l=j%2;
				pY=0;
				pCb=0;
				pCr=0;
				pY=tempBGR[i][j].Y*pY1+tempBGR[i][j].Cb*pCb1+tempBGR[i][j].Cr*pCr1;
				pY=pY/10000;
				out_Image[i][j].Y=(int)pY;

				if(!(k&l)){
					pCb=tempBGR[i][j].Y*pY2+tempBGR[i][j].Cb*pCb2;
					pCb=pCb+tempBGR[i][j].Cr*pCr2+1280000;
					pCb=pCb/10000;
					out_Image[i][j].Cb=(int)pCb;
					
					pCr=tempBGR[i][j].Y*pY3+tempBGR[i][j].Cb*pCb3;
					pCr=pCr+tempBGR[i][j].Cr*pCr3+1280000;
					
					pCr=pCr/10000;
					out_Image[i][j].Cr=(int)pCr;
					}
				
	    		}
	  	}
	}
	//////////分块 16*16到8*8
	//取样为 4:1:1 取样 source为16*16取样矩阵 ,,
	//source1;source2;source3;source4 为亮度值 
	//out_cb[8][8], out_cr[8][8];为 色度值  隔一点取一值;
	void divide(lastblk (*source)[16], short (*source1)[8],short (*source2)[8],short (*source3)[8],short (*source4)[8],short (*out_cb)[8],short (*out_cr)[8])
	{
   		int i,j;
 		for(i=0;i<16;i++){
	 		for(j=0;j<16;j++){
	   		if(i<8){
	     		if(j<8){
	       			source1[i][j]=source[i][j].Y;
	     		}
	     		else{
	       			source2[i][j%8]=source[i][j].Y;
	       		}
	       	}
	  		else{
		      	if(j<8){
		       		source3[i%8][j]=source[i][j].Y;
		       	}
		      	else{
		       		source4[i%8][j%8]=source[i][j].Y;
					}
				}
				out_cb[i/2][j/2]=source[i][j].Cb;
				out_cr[i/2][j/2]=source[i][j].Cr;
			}
		}
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -