資源簡介
這個非常有利于理解解碼jpg圖片的原理,作者是日本人,寫的很經典
代碼片段和文件信息
/*
?*?JPEG?decoding?engine?for?DCT-baseline
?*
?*??????copyrights?2003?by?nikq?|?nikq::club.
?*
?*?history::
?*?2003/04/28?|?added?OSASK-GUI?(?by?H.Kawai?)
?*?2003/05/12?|?optimized?DCT?(?20-bits?fixed?point?etc...)?->?line?407-464?(?by?I.Tak.?)
?*?2003/09/27?|?PICTURE0.BIN(DLL)梡偵夵憿?(?by?偔乕傒傫?)
?*?2003/09/28?|?奺庬僶僌僼傿僋僗仌懡彮偺嵟揔壔?(?by?H.Kawai?)
?*
?*/
typedef?unsigned?char?UCHAR;
struct?DLL_STRPICENV?{?int?work[16384];?};
typedef?struct
{
????int?elem;?//梫慺悢
????unsigned?short?code[256];
????unsigned?char??size[256];
????unsigned?char??value[256];
}HUFF;
typedef?struct
{
????//?SOF
????int?width;
????int?height;
????//?MCU
????int?mcu_width;
????int?mcu_height;
????int?max_hmax_v;
????int?compo_count;
????int?compo_id[3];
????int?compo_sample[3];
????int?compo_h[3];
????int?compo_v[3];
????int?compo_qt[3];
????//?SOS
????int?scan_count;
????int?scan_id[3];
????int?scan_ac[3];
????int?scan_dc[3];
????int?scan_h[3];??//?僒儞僾儕儞僌梫慺悢
????int?scan_v[3];??//?僒儞僾儕儞僌梫慺悢
????int?scan_qt[3];?//?検巕壔僥乕僽儖僀儞僨僋僗
????
????//?DRI
????int?interval;
????int?mcu_buf[32*32*4];?//僶僢僼傽
????int?*mcu_yuv[4];
????int?mcu_preDC[3];
????
????//?DQT
????int?dqt[3][64];
????int?n_dqt;
????
????//?DHT
????HUFF?huff[2][3];
????
????
????//?FILE?i/o
unsigned?char?*fp?*fp1;
????unsigned?long?bit_buff;
????int?bit_remain;
????int?width_buf;
int?base_img[64][64];?//?婎掙夋憸?(?[墶廃攇悢u兾][廲廃攇悢v兾][墶埵憡(M/8)][廲埵憡(N/8)]
????/*?for?dll?
????
????JPEG?*jpeg?=?(JPEG?*)malloc(sizeof(JPEG)?+?256);
????*/
????int?dummy[64];
????
}JPEG;
/*?for?16bit?*/
#ifndef?PIXEL16
#define?PIXEL16(r?g?b) ((r)?<11?|?(g)?<5?|?(b))
/*?0?<=?r?<=?31?0?<=?g?<=?63?0?<=?b?<=?31?*/
#endif
int?info_JPEG(struct?DLL_STRPICENV?*env?int?*info?int?size?UCHAR?*fp);
int?decode0_JPEG(struct?DLL_STRPICENV?*env?int?size?UCHAR?*fp?int?b_type?UCHAR?*buf?int?skip);
void?jpeg_idct_init(int?base_img[64][64]);
int?jpeg_init(JPEG?*jpeg);
//?int?jpeg_header(JPEG?*jpge);
void?jpeg_decode(JPEG?*jpeg?unsigned?char?*rgbint?b_type);
/*?-----------------?start?main?section?-----------------?*/
int?info_JPEG(struct?DLL_STRPICENV?*envint?*info?int?size?UCHAR?*fp0)
{
JPEG?*jpeg?=?(JPEG?*)?(((int?*)?env)?+?128);
jpeg->fp?=?fp0;
jpeg->fp1?=?fp0?+?size;
// if?(512?+?sizeof?(JPEG)?>?64?*?1024)
// return?0;
if?(jpeg_init(jpeg))
return?0;
// jpeg_header(jpeg);
if?(jpeg->width?==?0)
return?0;
info[0]?=?0x0002;
info[1]?=?0x0000;
info[2]?=?jpeg->width;
info[3]?=?jpeg->height;
/*?OK?*/
return?1;
}
int?decode0_JPEG(struct?DLL_STRPICENV?*envint?size?UCHAR?*fp0?int?b_type?UCHAR?*buf?int?skip)
{
JPEG?*jpeg?=?(JPEG?*)?(((int?*)?env)?+?128);
jpeg->fp?=?fp0;
jpeg->fp1?=?fp0?+?size;
jpeg_idct_init(jpeg->base_img);
jpeg_init(jpeg);
// jpeg_header(jpeg);
// if?(jpeg->width?==?0)
// return?8;
/*?decode0偱偼info偟偰偐傜屇偽傟傞偺偱丄偙傟偼側偄?*/
jpeg->width_buf?=?skip?/?(b_type?
- 上一篇:防火墻源碼用C++編寫
- 下一篇:用c++編寫的某公司工資管理系統
評論
共有 條評論