这是一个关于QT和JPEG解码技术的完整源代码集合,适用于研究与学习图像处理及编解码算法。
#ifndef JPEGDECODE_H
#define JPEGDECODE_H
#include global.h
#include globalextern.h
typedef unsigned char BYTE;
struct ImageComponentData {
double value[3];
};
class MBitReader {
public:
BYTE* Data;
int m_currentData;
int m_currentDataIndex;
int m_currentBitPosition;
MBitReader(BYTE* data, int currentDataIndex) {
Data = data;
m_currentBitPosition = 8;
m_currentDataIndex = currentDataIndex;
m_currentData = Data[m_currentDataIndex];
}
public:
int ReadNextBit() {
if (m_currentBitPosition - 1 < 0) {
if (Data[m_currentDataIndex + 1] != 0xFF) {
m_currentBitPosition = 8;
++m_currentDataIndex;
m_currentData = Data[m_currentDataIndex];
} else {
switch (Data[m_currentDataIndex + 2]) {
case 0x00:
m_currentBitPosition = 8;
m_currentDataIndex += 2;
m_currentData = 0xFF;
break;
case 0xD9:
return 0;
break;
default:
m_currentBitPosition = 8;
m_currentDataIndex += 2;
m_currentData = Data[m_currentDataIndex];
}
}
}
--m_currentBitPosition;
return (m_currentData >> m_currentBitPosition) & 0x01;
}
};
class MJpegDecode {
public:
struct _JFIFAPPOInfo {
BYTE APP0[2]; /* 02h 应用标记 */
BYTE Length[2]; /* 04h APP0字段长度 */
BYTE Identifier[5]; /* 06h JFIF (零终止标识符字符串) */
BYTE Version[2]; /* 0Bh JFIF格式修订号 */
BYTE Units; /* 0Dh 使用的单位 */
BYTE Xdensity[2]; /* 0Eh 水平分辨率 */
BYTE Ydensity[2]; /* 10h 垂直分辨率 */
BYTE XThumbnail; /* 12h 缩略图水平像素数 */
BYTE YThumbnail; /* 13h 缩略图垂直像素数 */
} JFIFAPPOINFO;
struct _JFIFDQTInfo {
BYTE DQT[2]; // 量化表段标记
BYTE Length[2]; // 量化表长度
BYTE Identifier; // 量化表ID
BYTE QTData[64]; // 量化表数据
} JFIFDQTINFO[2];
struct _JFIFSOFOInfo {
BYTE SOFO[2]; // 帧开始段标记
BYTE Length[2]; // 帧长度
BYTE BitCount; // 样本精度位数
BYTE Height[2]; // 图像像素高度
BYTE Width[2]; // 图像像素宽度
BYTE ComponentsCount; // 组件计数
BYTE YIdentifier; // 亮度Y的ID号
BYTE YHVSamplingCoefficient; // 垂直和水平采样系数
BYTE YUsedDQTIdentifier; // 使用量化表ID
BYTE CbIdentifier; // 色度Cb的ID号
BYTE CbHVSamplingCoefficient; // 垂直和水平采样系数
BYTE CbUsedDQTIdentifier; // 量化表使用ID
BYTE CrIdentifier; // 色度Cr的ID号
BYTE CrHVSamplingCoefficient; // 垂直和水平采样系数
BYTE CrUsedDQTIdentifier; // 使用量化表ID
} JFIFSOFOINFO;
struct _JFIFDRIInfo {
BYTE DRI[2];
BYTE Length[2];
BYTE NMCUReset[2]; // 每n个MCU块有一个RSTn标记
} JFIFDRIINFO;
struct _JFIFDHTInfo {
BYTE DHT[2]; // 哈夫曼表定义段标记
BYTE Length[2]; // 表长度
BYTE HTIdentifier; // 哈夫曼表号
BYTE NBitsSymbolsCount[16]; // 符号个数
BYTE SymbolsTable[256]; // 递增次序代码长度的符号表
} JFIFDHTINFO[2][2];
struct _JFIFSOSInfo {