资源简介
#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:
i
nt 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];
break;
}
}
}
--m_currentBitPosition;
return (m_currentData >> m_currentBitPosition) & 0x01;
}
};
class MJpegDecode
{
public:
struct _JFIFAPPOInfo
{
BYTE APP0[2]; /* 02h Application Use Marker */
BYTE Length[2]; /* 04h Length of APP0 Field */
BYTE Identifier[5]; /* 06h "JFIF" (zero terminated) Id String */
BYTE Version[2]; /* 0Bh JFIF Format Revision */
BYTE Units; /* 0Dh Units used for Resolution */
BYTE Xdensity[2]; /* 0Eh Horizontal Resolution */
BYTE Ydensity[2]; /* 10h Vertical Resolution */
BYTE XThumbnail; /* 12h Thumbnail Horizontal Pixel Count */
BYTE YThumbnail; /* 13h Thumbnail Vertical Pixel Count */
} JFIFAPPOINFO;
struct _JFIFDQTInfo
{
BYTE DQT[2]; // 14h 量化表段标记
BYTE Length[2]; // 16h 量化表段长度
BYTE Identifier; // 18h 量化表ID
BYTE QTData[64]; // 19h 量化表数据
} JFIFDQTINFO[2];
struct _JFIFSOFOInfo
{
BYTE SOFO[2]; // 9Eh 帧开始段标记
BYTE Length[2]; // A0h 帧开始段长度
BYTE BitCount; // A2h 样本精度bit位数
BYTE Height[2]; // A5h 图像像素宽度
BYTE Width[2]; // A3h 图像像素高度
BYTE ComponentsCount; // A7h 图像组件计数
BYTE YIdentifier; // A8h 亮度Y的ID号
BYTE YHVSamplingCoefficient; // A9h 亮度Y垂直和水平采样系数
BYTE YUsedDQTIdentifier; // AAh 亮度Y使用的量化表ID号
BYTE CbIdentifier; // ABh 色度Cb的ID号
BYTE CbHVSamplingCoefficient; // ACh 色度Cb垂直和水平采样系数
BYTE CbUsedDQTIdentifier; // ADh 色度Cb使用的量化表ID号
BYTE CrIdentifier; // AEh 色度Cr的ID号
BYTE CrHVSamplingCoefficient; // AFh 色度Cr垂直和水平采样系数
BYTE CrUsedDQTIdentifier; // B0h 色度Cr使用的量化表ID号
} JFIFSOFOINFO;
struct _JFIFDRIInfo
{
BYTE DRI[2];
BYTE Length[2];
BYTE NMCUReset[2]; //每n个MCU块就有一个 RSTn 标记.
} JFIFDRIINFO;
struct _JFIFDHTInfo
{
BYTE DHT[2]; // B1h 哈夫曼表定义段标记
BYTE Length[2]; // B3h 哈夫曼表段长度
BYTE HTIdentifier; // B5h 哈夫曼表号
BYTE NBitsSymbolsCount[16]; // B6h (符号的二进制位长度为n)的符号个数
BYTE SymbolsTable[256]; // C6h 按递增次序代码长度排列的符号表
} JFIFDHTINFO[2][2];
struct _JFIFSOSInfo
{
BYTE SOS[2]; // 261h 扫描开始段标记
BYTE Length[2]; // 263h 扫描开始段长度
BYTE ComponentsCount; // 265h 扫描行内组件的数量
BYTE YIdentifier; // 266h 亮度Y的ID号
BYTE YHTTableID; // 267h 亮度Y使用的哈夫曼表ID号
BYTE CbIdentifier; // 268h 色度Cb的ID号
BYTE CbHTTableID; // 269h 色度Cb使用的哈夫曼表ID号
BYTE CrIdentifier; // 26Ah 色度Cr的ID号
BYTE CrHTTableID; // 26Bh 色度Cr使用的哈夫曼表ID号
BYTE Reserved[3]; // 26Ch 3个未知保留字节
} JFIFSOSINFO;
private:
struct HuffmanTable
{
int CodeOfFirstNLengthSymbol[17]; //长度为N的第一个码字的整数值
int NLengthToSymbolsTableIndex[16]; //查表得到第一个长度为N的符号位于符号表的索引
} HUFFMANTABLE[2][2];
public:
int ReadJFIFInfo(const BYTE* const jfifData,int jfifDataSize);
void DecodeData(int mcuStartIndex,BYTE* jfifData,int jfifDataSize,ImageComponentData*& targetBitmapData);
void SetHuffmanTable();
void DecodeOneDUDC(MBitReader* myBitReader,double* DU,double& lastDC,int index1,int index2);
void DecodeOneDUAC(MBitReader* myBitReader,double* DU,int index1,int index2);
void DecodeOneMCU(MBitReader* myBitReader,int mcuXn,int mcuYn,int mcuWidth,int mcuHeight,double *DU,ImageComponentData* targetImage);
void InverseQuantization(double* du,BYTE* quantizationTable);
void InverseZigzag(double* sourceDU,double* targetDU);
void IDCT(double* sourceDU,double* targetDU);
void YCbCrToRGB(ImageComponentData* sourceImage,ImageComponentData* targetImage);
public:
int imageHeight;
int imageWidth;
int alignedImageWidth;
int alignedImageHeight;
HuffmanTable* HT;
double DC[3];
int HSamplingCoefficient[3];
int VSamplingCoefficient[3];
int DQTID[3];
int nMCUReset;
};
#endif // 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:
i
nt 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];
break;
}
}
}
--m_currentBitPosition;
return (m_currentData >> m_currentBitPosition) & 0x01;
}
};
class MJpegDecode
{
public:
struct _JFIFAPPOInfo
{
BYTE APP0[2]; /* 02h Application Use Marker */
BYTE Length[2]; /* 04h Length of APP0 Field */
BYTE Identifier[5]; /* 06h "JFIF" (zero terminated) Id String */
BYTE Version[2]; /* 0Bh JFIF Format Revision */
BYTE Units; /* 0Dh Units used for Resolution */
BYTE Xdensity[2]; /* 0Eh Horizontal Resolution */
BYTE Ydensity[2]; /* 10h Vertical Resolution */
BYTE XThumbnail; /* 12h Thumbnail Horizontal Pixel Count */
BYTE YThumbnail; /* 13h Thumbnail Vertical Pixel Count */
} JFIFAPPOINFO;
struct _JFIFDQTInfo
{
BYTE DQT[2]; // 14h 量化表段标记
BYTE Length[2]; // 16h 量化表段长度
BYTE Identifier; // 18h 量化表ID
BYTE QTData[64]; // 19h 量化表数据
} JFIFDQTINFO[2];
struct _JFIFSOFOInfo
{
BYTE SOFO[2]; // 9Eh 帧开始段标记
BYTE Length[2]; // A0h 帧开始段长度
BYTE BitCount; // A2h 样本精度bit位数
BYTE Height[2]; // A5h 图像像素宽度
BYTE Width[2]; // A3h 图像像素高度
BYTE ComponentsCount; // A7h 图像组件计数
BYTE YIdentifier; // A8h 亮度Y的ID号
BYTE YHVSamplingCoefficient; // A9h 亮度Y垂直和水平采样系数
BYTE YUsedDQTIdentifier; // AAh 亮度Y使用的量化表ID号
BYTE CbIdentifier; // ABh 色度Cb的ID号
BYTE CbHVSamplingCoefficient; // ACh 色度Cb垂直和水平采样系数
BYTE CbUsedDQTIdentifier; // ADh 色度Cb使用的量化表ID号
BYTE CrIdentifier; // AEh 色度Cr的ID号
BYTE CrHVSamplingCoefficient; // AFh 色度Cr垂直和水平采样系数
BYTE CrUsedDQTIdentifier; // B0h 色度Cr使用的量化表ID号
} JFIFSOFOINFO;
struct _JFIFDRIInfo
{
BYTE DRI[2];
BYTE Length[2];
BYTE NMCUReset[2]; //每n个MCU块就有一个 RSTn 标记.
} JFIFDRIINFO;
struct _JFIFDHTInfo
{
BYTE DHT[2]; // B1h 哈夫曼表定义段标记
BYTE Length[2]; // B3h 哈夫曼表段长度
BYTE HTIdentifier; // B5h 哈夫曼表号
BYTE NBitsSymbolsCount[16]; // B6h (符号的二进制位长度为n)的符号个数
BYTE SymbolsTable[256]; // C6h 按递增次序代码长度排列的符号表
} JFIFDHTINFO[2][2];
struct _JFIFSOSInfo
{
BYTE SOS[2]; // 261h 扫描开始段标记
BYTE Length[2]; // 263h 扫描开始段长度
BYTE ComponentsCount; // 265h 扫描行内组件的数量
BYTE YIdentifier; // 266h 亮度Y的ID号
BYTE YHTTableID; // 267h 亮度Y使用的哈夫曼表ID号
BYTE CbIdentifier; // 268h 色度Cb的ID号
BYTE CbHTTableID; // 269h 色度Cb使用的哈夫曼表ID号
BYTE CrIdentifier; // 26Ah 色度Cr的ID号
BYTE CrHTTableID; // 26Bh 色度Cr使用的哈夫曼表ID号
BYTE Reserved[3]; // 26Ch 3个未知保留字节
} JFIFSOSINFO;
private:
struct HuffmanTable
{
int CodeOfFirstNLengthSymbol[17]; //长度为N的第一个码字的整数值
int NLengthToSymbolsTableIndex[16]; //查表得到第一个长度为N的符号位于符号表的索引
} HUFFMANTABLE[2][2];
public:
int ReadJFIFInfo(const BYTE* const jfifData,int jfifDataSize);
void DecodeData(int mcuStartIndex,BYTE* jfifData,int jfifDataSize,ImageComponentData*& targetBitmapData);
void SetHuffmanTable();
void DecodeOneDUDC(MBitReader* myBitReader,double* DU,double& lastDC,int index1,int index2);
void DecodeOneDUAC(MBitReader* myBitReader,double* DU,int index1,int index2);
void DecodeOneMCU(MBitReader* myBitReader,int mcuXn,int mcuYn,int mcuWidth,int mcuHeight,double *DU,ImageComponentData* targetImage);
void InverseQuantization(double* du,BYTE* quantizationTable);
void InverseZigzag(double* sourceDU,double* targetDU);
void IDCT(double* sourceDU,double* targetDU);
void YCbCrToRGB(ImageComponentData* sourceImage,ImageComponentData* targetImage);
public:
int imageHeight;
int imageWidth;
int alignedImageWidth;
int alignedImageHeight;
HuffmanTable* HT;
double DC[3];
int HSamplingCoefficient[3];
int VSamplingCoefficient[3];
int DQTID[3];
int nMCUReset;
};
#endif // JPEGDECODE_H
代码片段和文件信息
#include “global.h“
#include “mainwindow.h“
#include “mjpegdecode.h“
MainWindow* theUI;
class MJpegDecode* myJpegDecode;
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 128 2013-07-18 01:18 JPEG_Decode\global.cpp
文件 111 2013-07-18 01:12 JPEG_Decode\global.h
文件 167 2013-07-18 01:18 JPEG_Decode\globalextern.h
文件 484 2013-07-12 04:33 JPEG_Decode\JPEG_Decode.pro
文件 17794 2013-08-24 00:15 JPEG_Decode\JPEG_Decode.pro.user
文件 17794 2013-08-10 04:14 JPEG_Decode\JPEG_Decode.pro.user.18e37f8
文件 264 2013-07-18 01:15 JPEG_Decode\main.cpp
文件 2179 2013-08-23 04:33 JPEG_Decode\mainwindow.cpp
文件 515 2013-07-12 22:30 JPEG_Decode\mainwindow.h
文件 14353 2013-07-29 02:37 JPEG_Decode\mainwindow.ui
文件 16967 2013-08-19 06:01 JPEG_Decode\mjpegdecode.cpp
文件 6578 2013-08-19 06:01 JPEG_Decode\mjpegdecode.h
目录 0 2013-08-24 00:15 JPEG_Decode
----------- --------- ---------- ----- ----
77334 13
相关资源
- vc URL编解码类
- 将yuv各种格式的图片转换为jpg格式的
- Qt 播放音频文件
- 2006年湖北工业大学409数据结构试题
- jpeg图像压缩实例代码
- Qt 读取16进制的data文件
- MQTT+串口(usart)透传
- 易语言QQTEA算法源码
- VC工程转Qt工程文件的工具
- MQTT推送Demo
- 基于Linux、QT的视频监控系统的设计与
- Qt 百度地图 定位
- QT酷炫界面开发指南《QmlBook》
- VS1053B编解码器的VDR分布式声音采集卡
- ETC中FM0解码器的设计
- H.264视频编码基本知识
- Ubuntu下操作Excel,qt代码
- Qt图片浏览器 --基于Qt的Graphics View f
- 基于V4L2的视频采集,能够采集YUVJPE
- qtnribbon2破解
- Qt软件开发 完整项目代码
- x264源码及其配置文件,用于配置树莓
- FFMEPG实现h264解码
- 解码hevc解析h265流
- 电信物联网NB-lot上传编解码插件检测
- MQTT_3.1protocol_Specific中文版
- 一种基于DAB接收机的MP3播放器设计方
- 在QT中使用RTP进行视频的采集和传输
- 易语言URL解码算法源码
- 易语言图像编码、解码器源码易语言
评论
共有 条评论