• 大小: 17KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-06-01
  • 语言: C/C++
  • 标签: jpg  c语言  源代码  

资源简介

这个非常有利于理解解码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 

评论

共有 条评论