📄 user_ini_encode.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 + -