//写入帧头 void jmkr_write_frame_head(jpeg_compress_info *cinfo) { int i; u16 Lf,X,Y; u8 P,Nf,C,H,V,Tq; jutl_write_byte(0xFF,cinfo->output); jutl_write_byte(SOF0,cinfo->output); Nf=cinfo->num_comp; P=cinfo->precision; X=cinfo->image_width; Y=cinfo->image_height; Lf=8+3*Nf; jutl_write_byte(Lf>>8,cinfo->output); jutl_write_byte(Lf&0xFF,cinfo->output); jutl_write_byte(P,cinfo->output); jutl_write_byte(Y>>8,cinfo->output); jutl_write_byte(Y&0xFF,cinfo->output); jutl_write_byte(X>>8,cinfo->output); jutl_write_byte(X&0xFF,cinfo->output); jutl_write_byte(Nf,cinfo->output); for(i=0;i<Nf;i++) { C=cinfo->comp[i].comp_id; H=cinfo->comp[i].h_factor; V=cinfo->comp[i].v_factor; Tq=cinfo->comp[i].quant_tbl_no; jutl_write_byte(C,cinfo->output); jutl_write_byte(((H<<4)|V),cinfo->output); jutl_write_byte(Tq,cinfo->output); } }
void jhuff_write_bits (jpeg_compress_info *cinfo, UINT32 data, int len) { #ifdef DEBUG printf("(b:%d;%d/%d)", bits_in_buffer, data, len); #endif UINT32 tdata; while (len>0) { tdata = (data<<(32-len)); buffer.all |= ((tdata >> bits_in_buffer)); bits_in_buffer += len; /* output buffer */ if (bits_in_buffer >= 32) { int i; /* must be BIG ENDIAN */ for (i=3; i>=0; i--) { jutl_write_byte(buffer.c[i], cinfo->output); if (buffer.c[i]==0xFF) jutl_write_byte(0x00, cinfo->output); } buffer.all = 0; len = bits_in_buffer - 32; bits_in_buffer=0; }else{ len=0; } } #ifdef DEBUG printf("..buffer..%08X\n", buffer.all); #endif }
//写入扫描开始标志 void jmkr_write_scan_head(jpeg_compress_info *cinfo) { int i; u16 Ls; u8 Ns,Ss,Se,Ah,Al,Cs,Td,Ta; jutl_write_byte(0xFF,cinfo->output); jutl_write_byte(SOS,cinfo->output); Ns=cinfo->num_comp; Ls=6+2*Ns; Ss=0;//定值!不改变 Se=63; Ah=Al=0; jutl_write_byte(Ls>>8,cinfo->output); jutl_write_byte(Ls&0xFF,cinfo->output); jutl_write_byte(Ns,cinfo->output); for(i=0;i<Ns;i++) { Cs=cinfo->comp[i].comp_id; Td=cinfo->comp[i].dc_tbl_no; Ta=cinfo->comp[i].ac_tbl_no; jutl_write_byte(Cs,cinfo->output); jutl_write_byte((Td<<4|Ta),cinfo->output); } jutl_write_byte(Ss,cinfo->output); jutl_write_byte(Se,cinfo->output); jutl_write_byte(((Ah<<4)|Al),cinfo->output); }
//清除/释放缓冲区 void jhuff_flush_buffer(jpeg_compress_info *cinfo) { int i=3; while(bits_in_buffer>8) { jutl_write_byte(buffer.c[i],cinfo->output); if(buffer.c[i]==0xFF)jutl_write_byte(0x00,cinfo->output); i--; bits_in_buffer-=8; } if(bits_in_buffer>0) { buffer.c[i]|=((u8)(0xFF)>>bits_in_buffer); jutl_write_byte(buffer.c[i],cinfo->output); if(buffer.c[i]==0xFF)jutl_write_byte(0x00,cinfo->output); }
void jhuff_flush_buffer(jpeg_compress_info *cinfo) { int i; i = 3; #ifdef DEBUG printf(" <FB:%08X,%d ", buffer.all, bits_in_buffer); #endif while (bits_in_buffer > 8) { jutl_write_byte(buffer.c[i], cinfo->output); if (buffer.c[i]==0xFF) jutl_write_byte(0x00, cinfo->output); i--; bits_in_buffer -= 8; } if(bits_in_buffer > 0) { buffer.c[i] |= ((unsigned char)(0xFF) >> bits_in_buffer); jutl_write_byte(buffer.c[i], cinfo->output); if (buffer.c[i]==0xFF) jutl_write_byte(0x00, cinfo->output); }
//写入量化表 void jmkr_write_quant_table(jpeg_compress_info *cinfo) { int i, j; for (i=0;i<NUM_QUANT_TBLS;i++) { if (!cinfo->quant_table[i])continue; jutl_write_byte(0xFF,cinfo->output); jutl_write_byte(DQT,cinfo->output); jutl_write_byte(0x00,cinfo->output); jutl_write_byte(0x43,cinfo->output);//长度:固定为43h jutl_write_byte(i&0xFF,cinfo->output);//ouput Pq & Tq for (j=0;j<DCTSIZE2;j++) { u8 Q=cinfo->quant_table[i]->quantval[j]; jutl_write_byte(Q,cinfo->output); } } }
//写文件结束标志 void jmkr_write_end(jpeg_compress_info *cinfo) { jutl_write_byte(0xFF,cinfo->output); cinfo->state =JC_FINISH;//状态为完成 jutl_write_byte(EOI,cinfo->output); }
//写入哈夫曼表 void jmkr_write_huff_table(jpeg_compress_info *cinfo) { int i,j,num_val; u16 Lh; for(i=0;i<NUM_HUFF_TBLS;i++)//输出直流HUFFMAN码 { num_val=0; if(!cinfo->dc_huff_table[i])continue; jutl_write_byte(0xFF,cinfo->output); jutl_write_byte(DHT,cinfo->output); for(j=1;j<=16;j++)num_val+=cinfo->dc_huff_table[i]->bits[j]; Lh=3+16+num_val;//长度,固定为43h jutl_write_byte(Lh>>8,cinfo->output); jutl_write_byte(Lh&0xFF,cinfo->output); jutl_write_byte(i,cinfo->output);//输出ID for(j=1;j<=16;j++)jutl_write_byte(cinfo->dc_huff_table[i]->bits[j],cinfo->output);//输出bits for(j=0;j<num_val;j++)jutl_write_byte(cinfo->dc_huff_table[i]->huffval[j],cinfo->output); } for(i=0;i<NUM_HUFF_TBLS;i++)//输出交流HUFFMAN码 { num_val=0; if(!cinfo->ac_huff_table[i])continue; jutl_write_byte(0xFF,cinfo->output); jutl_write_byte(DHT,cinfo->output); for(j=1;j<=16;j++)num_val+=cinfo->ac_huff_table[i]->bits[j]; Lh=3+16+num_val;//长度,固定为43h jutl_write_byte(Lh>>8,cinfo->output); jutl_write_byte(Lh&0xFF,cinfo->output); jutl_write_byte((0x10|i),cinfo->output);//输出ID for(j=1;j<=16;j++)jutl_write_byte(cinfo->ac_huff_table[i]->bits[j],cinfo->output);//输出bits for(j=0;j<num_val;j++)jutl_write_byte(cinfo->ac_huff_table[i]->huffval[j],cinfo->output); } }
//写入APP0应用数据段 void jmkr_write_jfif(jpeg_compress_info *cinfo) { int i; for (i=0;i<18;i++)jutl_write_byte(jfcode[i], cinfo->output); }
//写入文件开始标志 void jmkr_write_image_start(jpeg_compress_info *cinfo) { jutl_write_byte(0xFF,cinfo->output); jutl_write_byte(SOI,cinfo->output); }