JOutputStream& JFileIOStream::operator<<(const JBlock &B) { int numWrite; int numBytes = B.size(); if (!numBytes) return *this; if ((numWrite = _write_(hnd, B, numBytes)) < 0) { throw new JIOException("file write error"); } else if (numWrite != numBytes) { B.setSize(numWrite); throw new JIOException("file write not complete"); } return *this; }
//------------------------------------------------------------------------------- void JpegEncoder::_write_jpeg_header(FILE* fp) { //SOI _write_word_(0xFFD8, fp); // marker = 0xFFD8 //APPO _write_word_(0xFFE0,fp); // marker = 0xFFE0 _write_word_(16, fp); // length = 16 for usual JPEG, no thumbnail _write_("JFIF", 5, fp); // 'JFIF\0' _write_byte_(1, fp); // version_hi _write_byte_(1, fp); // version_low _write_byte_(0, fp); // xyunits = 0 no units, normal density _write_word_(1, fp); // xdensity _write_word_(1, fp); // ydensity _write_byte_(0, fp); // thumbWidth _write_byte_(0, fp); // thumbHeight //DQT _write_word_(0xFFDB, fp); //marker = 0xFFDB _write_word_(132, fp); //size=132 _write_byte_(0, fp); //QTYinfo== 0: bit 0..3: number of QT = 0 (table for Y) // bit 4..7: precision of QT // bit 8 : 0 _write_(m_YTable, 64, fp); //YTable _write_byte_(1, fp); //QTCbinfo = 1 (quantization table for Cb,Cr) _write_(m_CbCrTable, 64, fp); //CbCrTable //SOFO _write_word_(0xFFC0, fp); //marker = 0xFFC0 _write_word_(17, fp); //length = 17 for a truecolor YCbCr JPG _write_byte_(8, fp); //precision = 8: 8 bits/sample _write_word_(m_height&0xFFFF, fp); //height _write_word_(m_width&0xFFFF, fp); //width _write_byte_(3, fp); //nrofcomponents = 3: We encode a truecolor JPG _write_byte_(1, fp); //IdY = 1 _write_byte_(0x11, fp); //HVY sampling factors for Y (bit 0-3 vert., 4-7 hor.)(SubSamp 1x1) _write_byte_(0, fp); //QTY Quantization Table number for Y = 0 _write_byte_(2, fp); //IdCb = 2 _write_byte_(0x11, fp); //HVCb = 0x11(SubSamp 1x1) _write_byte_(1, fp); //QTCb = 1 _write_byte_(3, fp); //IdCr = 3 _write_byte_(0x11, fp); //HVCr = 0x11 (SubSamp 1x1) _write_byte_(1, fp); //QTCr Normally equal to QTCb = 1 //DHT _write_word_(0xFFC4, fp); //marker = 0xFFC4 _write_word_(0x01A2, fp); //length = 0x01A2 _write_byte_(0, fp); //HTYDCinfo bit 0..3 : number of HT (0..3), for Y =0 // bit 4 : type of HT, 0 = DC table,1 = AC table // bit 5..7 : not used, must be 0 _write_(Standard_DC_Luminance_NRCodes, sizeof(Standard_DC_Luminance_NRCodes), fp); //DC_L_NRC _write_(Standard_DC_Luminance_Values, sizeof(Standard_DC_Luminance_Values), fp); //DC_L_VALUE _write_byte_(0x10, fp); //HTYACinfo _write_(Standard_AC_Luminance_NRCodes, sizeof(Standard_AC_Luminance_NRCodes), fp); _write_(Standard_AC_Luminance_Values, sizeof(Standard_AC_Luminance_Values), fp); //we'll use the standard Huffman tables _write_byte_(0x01, fp); //HTCbDCinfo _write_(Standard_DC_Chromiance_NRCodes, sizeof(Standard_DC_Chromiance_NRCodes), fp); _write_(Standard_DC_Chromiance_Values, sizeof(Standard_DC_Chromiance_Values), fp); _write_byte_(0x11, fp); //HTCbACinfo _write_(Standard_AC_Chromiance_NRCodes, sizeof(Standard_AC_Chromiance_NRCodes), fp); _write_(Standard_AC_Chromiance_Values, sizeof(Standard_AC_Chromiance_Values), fp); //SOS _write_word_(0xFFDA, fp); //marker = 0xFFC4 _write_word_(12, fp); //length = 12 _write_byte_(3, fp); //nrofcomponents, Should be 3: truecolor JPG _write_byte_(1, fp); //Idy=1 _write_byte_(0, fp); //HTY bits 0..3: AC table (0..3) // bits 4..7: DC table (0..3) _write_byte_(2, fp); //IdCb _write_byte_(0x11, fp); //HTCb _write_byte_(3, fp); //IdCr _write_byte_(0x11, fp); //HTCr _write_byte_(0, fp); //Ss not interesting, they should be 0,63,0 _write_byte_(0x3F, fp); //Se _write_byte_(0, fp); //Bf }
//------------------------------------------------------------------------------- void JpegEncoder::_write_word_(unsigned short value, FILE* fp) { unsigned short _value = ((value>>8)&0xFF) | ((value&0xFF)<<8); _write_(&_value, 2, fp); }
//------------------------------------------------------------------------------- void JpegEncoder::_write_byte_(unsigned char value, FILE* fp) { _write_(&value, 1, fp); }