JPEG文件分为两个部分,标记码(Tag)和压缩数据。
码流格式设计依次为:SOI、APP0info、DQTinfo、DRIinfo、SOFinfo、DHTinfo、SOSinfo和EOI。具体结构如下:
#define BYTE unsigned char
#define WORD unsigned short int
#define SOI 0xFFD8 // Start of Image
#define EOI 0xFFD9 // End of Image
static struct APP0info{
WORD marker; // 0xFFE0
WORD length; // 16 for usual JPEG
BYTE JFIFsignature[5]; // ="JFIF",'/0'=0x4A,0x46,0x49,0x46,0x00
WORD version; // 0x0101,0x0102
BYTE xyunits; // 0 for default
WORD xdensity;
WORD ydensity;
BYTE num_of_x;
BYTE num_of_y;
//RGB0---RGBn ??
}APP0info;
static struct DQTinfo{ // Define quantization table
WORD marker; // 0xFFDB
WORD length; // 132 for usual case
BYTE QTYinfo; // Pq(7:4)=0,1:8bit or 16bit precision; Tq(3:0)=0,1,2,3:id of QT table
BYTE Ytable[64]; // may be WORD size according to Pq,zigzag arrange
BYTE QTCbCrinfo;
BYTE CbCrtable[64];
}DQTinfo;
static struct DRIinfo{ // Define Start interval
WORD marker; // 0xFFDD
WORD length;
WORD RI;
}DRIinfo;
static struct SOFinfo{ //Start of Frame
WORD marker; // 0xFFC0
WORD length; //=17 for a true color YCbCr
BYTE precision; // for basemode:0x08, 8bit/sample
WORD height;
WORD width;
BYTE num_of_component; // 0x01 for grayscale, 0x03 for YCrCb
BYTE IdY;
BYTE Y_SFactor;
BYTE QTY;
BYTE IdCb;
BYTE Cb_SFactor;
BYTE QTCb;
BYTE IdCr;
BYTE Cr_SFactor;
BYTE QTCr;
}SOFinfo;
static struct DHTinfo{ // Define Huffman Table
WORD marker; // 0xFFC4
WORD length; // =0x01A2
BYTE HT_YDC_info; // Tc(7:4):0 for DC and 1 for AC, Th(3:0): for base mode, it can be 0,1
BYTE YDC_index[16];
BYTE YDC_values[12];
BYTE HT_YAC_info; // 0x10
BYTE YAC_index[16];
BYTE YAC_value[162];
BYTE HT_CbCrDC_info;
BYTE CbCrDC_index[16];
BYTE CbCrDC_value[12];
BYTE HT_CbCrAC_info; // 0x11
BYTE CbCrAC_index[16];
BYTE CbCrAC_values[162];
}DHTinfo;
static struct SOSinfo{
WORD marker; // 0xFFDA
WORD length; // =12
BYTE num_scan_component; // for base mode 1,3
BYTE IdY;
BYTE HTY;
BYTE IdCb;
BYTE HTCb;
BYTE IdCr;
BYTE HTCr;
BYTE Ss,Se,Bf; // 0x00, 0x3F, 0x00
}SOSinfo;