?? 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 + -