Jpeg解码小结(一)
博客专区 > tigerBin 的博客 > 博客详情
Jpeg解码小结(一)
tigerBin 发表于5个月前
Jpeg解码小结(一)
  • 发表于 5个月前
  • 阅读 16
  • 收藏 0
  • 点赞 0
  • 评论 0

Source:https://github.com/lzb-cc/JpegCodecs

数据结构:

	class Matrix
	{
	public:
		Matrix(){}
		void Create(int _rows, int _cols, int _channal) // 供外部调用的接口
		{
		    rows = _rows;
		    cols = _cols;
		    channal = _channal;
		    data = new uint8_t[_rows * _cols * _channal];
		}

		int rows;      // 图像高度
		int cols;      // 图像宽度
		int channal;   // 通道数(固定为 3, 即RGB颜色)
		uint8_t *data; // 图像数据
	};

 Matrix用于保存图像基本信息,包含图像的数据,图像的高度与宽度

解码时作为参数输入到JpegDecoder

 

JpegDecoder在构建一个对象时需要把文件路径作为参数输入,在构造函数中打开并读取文件数据到缓冲区stream 中,读取完毕后关闭文件

stream Jpg文件数据缓冲区
endOfDecoder 如果从 stream 中读取到的数据是 0xFFD9 ,表示需要解码的数据已经全部解码完成,此时解码工作全部完成
curIndex 用于指示当前从 stream 中读取的数据的位置
readCount 用于指示当前从 stream 中读取的一个字节已经有多少位 被解码了
quantY 从stream中读取Y分量的量化表
quantCbCr CbCr共用一张量化表
m_width 从stream读取图像的宽度信息
m_height 从stream读取图像的高度信息
yBlk 用于暂存从数据流中解码的四个Y分量数据块
cbBlk 用于暂存从数据流中解码的一个Cb分量数据块
crBlk 用于暂存从数据流中解码的一个Cr分量数据块
yBuf 16 x 16 的数据块(四个yBlk)
cbBuf 16 x 16 的数据块(由cbBlk反采样后形成)
crBuf 16 x 16 的数据块(由crBlk反采样后形成)
yDC,cbDC,crDC DC采用差分编码
DC,AC 四张哈夫曼表,用于解码用,从 DHT_Segment中读取,或从stream中读取

 

	class JpegDecoder
	{
	public:
		JpegDecoder(const char *fileName);
		~JpegDecoder();

		void Decoder(Matrix &mat);
	protected:
        // ......

	private:
		uint8_t       *stream;      //Jpeg文件数据流

		bool           endOfDecoder; // 数据流结束标记
		int	       curIndex;     // 解码到当前数据位
		uint8_t        readCount;    // 已经解码的当前字节的位数

		uint8_t        quantY[64];       // Y 分量量化表
		uint8_t        quantCbCr[64];    // CbCr 分量量化表

		int            m_width;          // 图像宽度
		int            m_height;         // 图像高度

		int            yBlk[4][64];
		int            cbBlk[64];
		int            crBlk[64];

		int            yBuf[256], cbBuf[256], crBuf[256];

		int            yDC, cbDC, crDC;

		/* huffman table */
		tinyStl::tinyMap DC[2], AC[2];
	};

 

标签: Jpeg C/C++
共有 人打赏支持
粉丝 0
博文 44
码字总数 14259
×
tigerBin
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: