📄 jpegenc.cpp
字号:
if(JPEG_OK != jerr)
return jerr;
// optimal huff table for each JPEG color component
jerr = AttachHuffmanTable(c, DC, c);
if(JPEG_OK != jerr)
return jerr;
}
}
return JPEG_OK;
} // CJPEGEncoder::SetParams()
JERRCODE CJPEGEncoder::InitHuffmanTable(
Ipp8u bits[16],
Ipp8u vals[256],
int tbl_id,
HTBL_CLASS tbl_class)
{
JERRCODE jerr;
if(MAX_HUFF_TABLES < tbl_id)
return JPEG_ERR_PARAMS;
switch(tbl_class)
{
case DC:
jerr = m_dctbl[tbl_id].Init(tbl_id,tbl_class,bits,vals);
break;
case AC:
jerr = m_actbl[tbl_id].Init(tbl_id,tbl_class,bits,vals);
break;
default:
return JPEG_ERR_PARAMS;
}
return jerr;
} // CJPEGEncoder::InitHuffmanTable()
JERRCODE CJPEGEncoder::InitQuantTable(
Ipp8u qnt[64],
int tbl_id,
int quality)
{
if(MAX_QUANT_TABLES < tbl_id)
return JPEG_ERR_PARAMS;
return m_qntbl[tbl_id].Init(tbl_id,qnt,quality);
} // CJPEGEncoder::InitQuantTable()
JERRCODE CJPEGEncoder::InitQuantTable(
Ipp16u qnt[64],
int tbl_id,
int quality)
{
if(MAX_QUANT_TABLES < tbl_id)
return JPEG_ERR_PARAMS;
return m_qntbl[tbl_id].Init(tbl_id,qnt,quality);
} // CJPEGEncoder::InitQuantTable()
JERRCODE CJPEGEncoder::AttachHuffmanTable(int tbl_id, HTBL_CLASS tbl_class, int comp_no)
{
if(MAX_HUFF_TABLES < tbl_id)
return JPEG_ERR_PARAMS;
if(comp_no > m_jpeg_ncomp)
return JPEG_ERR_PARAMS;
switch(tbl_class)
{
case DC:
m_ccomp[comp_no].m_dc_selector = tbl_id;
break;
case AC:
m_ccomp[comp_no].m_ac_selector = tbl_id;
break;
default:
return JPEG_ERR_PARAMS;
}
return JPEG_OK;
} // CJPEGEncoder::AttachHuffmanTable()
JERRCODE CJPEGEncoder::AttachQuantTable(int tbl_id, int comp_no)
{
if(MAX_QUANT_TABLES < tbl_id)
return JPEG_ERR_PARAMS;
if(comp_no > m_jpeg_ncomp)
return JPEG_ERR_PARAMS;
m_ccomp[comp_no].m_q_selector = tbl_id;
return JPEG_OK;
} // CJPEGEncoder::AttachQuantTable()
JERRCODE CJPEGEncoder::WriteSOI(void)
{
JERRCODE jerr;
TRC0("-> WriteSOI");
TRC1(" emit marker ",JM_SOI);
jerr = m_BitStreamOut.WriteWord(0xff00 | JM_SOI);
if(JPEG_OK != jerr)
return jerr;
return JPEG_OK;
} // CJPEGEncoder::WriteSOI()
JERRCODE CJPEGEncoder::WriteEOI(void)
{
JERRCODE jerr;
TRC0("-> WriteEOI");
TRC1("emit marker ",JM_EOI);
jerr = m_BitStreamOut.WriteWord(0xff00 | JM_EOI);
if(JPEG_OK != jerr)
return jerr;
return JPEG_OK;
} // CJPEGEncoder::WriteEOI()
JERRCODE CJPEGEncoder::WriteAPP0(void)
{
int len;
JERRCODE jerr;
TRC0("-> WriteAPP0");
len = 2 + 5 + 2 + 1 + 2 + 2 + 1 + 1;
TRC1(" emit marker ",JM_APP0);
TRC1(" length ",len);
jerr = m_BitStreamOut.WriteWord(0xff00 | JM_APP0);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamOut.WriteWord(len);
if(JPEG_OK != jerr)
return jerr;
// identificator JFIF
jerr = m_BitStreamOut.WriteByte('J');
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamOut.WriteByte('F');
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamOut.WriteByte('I');
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamOut.WriteByte('F');
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamOut.WriteByte(0);
if(JPEG_OK != jerr)
return jerr;
// version
jerr = m_BitStreamOut.WriteWord(0x0102);
if(JPEG_OK != jerr)
return jerr;
// units: 0 - none, 1 - dot per inch, 2 - dot per cm
jerr = m_BitStreamOut.WriteByte(0);
if(JPEG_OK != jerr)
return jerr;
// xDensity
jerr = m_BitStreamOut.WriteWord(1);
if(JPEG_OK != jerr)
return jerr;
// yDensity
jerr = m_BitStreamOut.WriteWord(1);
if(JPEG_OK != jerr)
return jerr;
// xThumbnails, yThumbnails
jerr = m_BitStreamOut.WriteByte(0);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamOut.WriteByte(0);
if(JPEG_OK != jerr)
return jerr;
return JPEG_OK;
} // CJPEGEncoder::WriteAPP0()
JERRCODE CJPEGEncoder::WriteAPP14(void)
{
int len;
JERRCODE jerr;
TRC0("-> WriteAPP14");
len = 2 + 5 + 2 + 2 + 2 + 1;
TRC1(" emit marker ",JM_APP14);
TRC1(" length ",len);
jerr = m_BitStreamOut.WriteWord(0xff00 | JM_APP14);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamOut.WriteWord(len);
if(JPEG_OK != jerr)
return jerr;
// identificator Adobe
jerr = m_BitStreamOut.WriteByte('A');
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamOut.WriteByte('d');
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamOut.WriteByte('o');
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamOut.WriteByte('b');
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamOut.WriteByte('e');
if(JPEG_OK != jerr)
return jerr;
// version
jerr = m_BitStreamOut.WriteWord(100);
if(JPEG_OK != jerr)
return jerr;
// Flags 0
jerr = m_BitStreamOut.WriteWord(0);
if(JPEG_OK != jerr)
return jerr;
// Flags 1
jerr = m_BitStreamOut.WriteWord(0);
if(JPEG_OK != jerr)
return jerr;
switch(m_jpeg_color)
{
case JC_YCBCR:
jerr = m_BitStreamOut.WriteByte(1);
break;
case JC_YCCK:
jerr = m_BitStreamOut.WriteByte(2);
break;
default:
jerr = m_BitStreamOut.WriteByte(0);
break;
}
if(JPEG_OK != jerr)
return jerr;
return JPEG_OK;
} // CJPEGEncoder::WriteAPP14()
JERRCODE CJPEGEncoder::WriteCOM(
char* comment)
{
int i;
int len;
char* ptr;
char buf[128];
JERRCODE jerr;
TRC0("-> WriteCOM");
if(comment != 0)
{
len = (int)strlen(comment) + 1;
ptr = comment;
}
else
{
buf[0] = 0;
ptr = &buf[0];
const IppLibraryVersion* jv = ippjGetLibVersion();
sprintf(ptr,"Intel(R) IPP JPEG encoder [%d.%d.%d] - %s",
jv->major,
jv->minor,
jv->build,
jv->BuildDate);
len = (int)strlen(ptr) + 1;
}
len += 2;
TRC1(" emit marker ",JM_COM);
TRC1(" length ",len);
jerr = m_BitStreamOut.WriteWord(0xff00 | JM_COM);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamOut.WriteWord(len);
if(JPEG_OK != jerr)
return jerr;
for(i = 0; i < len - 2; i++)
{
jerr = m_BitStreamOut.WriteByte(ptr[i]);
if(JPEG_OK != jerr)
return jerr;
}
return JPEG_OK;
} // CJPEGEncoder::WriteCOM()
JERRCODE CJPEGEncoder::WriteDQT(
CJPEGEncoderQuantTable* qtbl)
{
int i;
int len;
JERRCODE jerr;
TRC0("-> WriteDQT");
len = DCTSIZE2 + 2 + 1;
if(qtbl->m_precision)
len += DCTSIZE2;
TRC1(" emit marker ",JM_DQT);
TRC1(" length ",len);
jerr = m_BitStreamOut.WriteWord(0xff00 | JM_DQT);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamOut.WriteWord(len);
if(JPEG_OK != jerr)
return jerr;
// precision/id
jerr = m_BitStreamOut.WriteByte((qtbl->m_precision << 4) | qtbl->m_id);
if(JPEG_OK != jerr)
return jerr;
TRC1(" id ",qtbl->m_id);
TRC1(" precision ",qtbl->m_precision);
TRC(endl);
for(i = 0; i < DCTSIZE2; i++)
{
TRC(" ");
TRC((int)qtbl->m_raw[i]);
if(i % 8 == 7)
{
TRC(endl);
}
}
TRC(endl);
for(i = 0; i < DCTSIZE2; i++)
{
if(qtbl->m_precision == 0)
{
jerr = m_BitStreamOut.WriteByte(qtbl->m_raw8u[i]);
}
else
{
jerr = m_BitStreamOut.WriteWord(qtbl->m_raw16u[i]);
}
if(JPEG_OK != jerr)
return jerr;
}
return JPEG_OK;
} // CJPEGEncoder::WriteDQT()
JERRCODE CJPEGEncoder::WriteDHT(
CJPEGEncoderHuffmanTable* htbl)
{
int i;
int len;
int htbl_len;
JERRCODE jerr;
TRC0("-> WriteDHT");
for(htbl_len = 0, i = 0; i < 16; i++)
{
htbl_len += htbl->m_bits[i];
}
len = 16 + htbl_len + 2 + 1;
TRC1(" emit marker ",JM_DHT);
TRC1(" length ",len);
jerr = m_BitStreamOut.WriteWord(0xff00 | JM_DHT);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamOut.WriteWord(len);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamOut.WriteByte((htbl->m_hclass << 4) | htbl->m_id);
if(JPEG_OK != jerr)
return jerr;
TRC1(" id ",htbl->m_id);
TRC1(" class ",htbl->m_hclass);
for(i = 0; i < 16; i++)
{
jerr = m_BitStreamOut.WriteByte(htbl->m_bits[i]);
if(JPEG_OK != jerr)
return jerr;
}
for(i = 0; i < htbl_len; i++)
{
jerr = m_BitStreamOut.WriteByte(htbl->m_vals[i]);
if(JPEG_OK != jerr)
return jerr;
}
return JPEG_OK;
} // CJPEGEncoder::WriteDHT()
JERRCODE CJPEGEncoder::WriteSOF0(void)
{
int len;
JERRCODE jerr;
TRC0("-> WriteSOF0");
len = 8 + m_jpeg_ncomp * 3;
TRC1(" emit marker ",JM_SOF0);
TRC1(" length ",len);
jerr = m_BitStreamOut.WriteWord(0xff00 | JM_SOF0);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamOut.WriteWord(len);
if(JPEG_OK != jerr)
return jerr;
// sample precision
jerr = m_BitStreamOut.WriteByte(8);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamOut.WriteWord(m_src.height);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamOut.WriteWord(m_src.width);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamOut.WriteByte(m_jpeg_ncomp);
if(JPEG_OK != jerr)
return jerr;
for(int i = 0; i < m_jpeg_ncomp; i++)
{
jerr = m_BitStreamOut.WriteByte(i);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamOut.WriteByte((m_ccomp[i].m_hsampling << 4) | m_ccomp[i].m_vsampling);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamOut.WriteByte(m_ccomp[i].m_q_selector);
if(JPEG_OK != jerr)
return jerr;
}
return JPEG_OK;
} // CJPEGEncoder::WriteSOF0()
JERRCODE CJPEGEncoder::WriteSOF1(void)
{
int len;
JERRCODE jerr;
TRC0("-> WriteSOF1");
len = 8 + m_jpeg_ncomp * 3;
TRC1(" emit marker ",JM_SOF1);
TRC1(" length ",sof1_len);
jerr = m_BitStreamOut.WriteWord(0xff00 | JM_SOF1);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamOut.WriteWord(len);
if(JPEG_OK != jerr)
return jerr;
// sample precision
jerr = m_BitStreamOut.WriteByte(m_jpeg_precision);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamOut.WriteWord(m_src.height);
if(JPEG_OK != jerr)
return jerr;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -