多媒体技术与应用 下载本文

//将数据放到各个子块 for(k=0;k<4096;k++) {

for(i=0;i<8;i++) for(j=0;j<8;j++) {

FkGray[k][i][j] = *lptemp; lptemp++; } } //

double *f1 = new double[64]; //还原量化前的系数(即DCT系数) //int *f = new int[64]; //存放DCT系数反变换后的数据缓冲区 int m;

for(k=0;k<4096;k++) {

m=0;

for(i=0;i<8;i++) {

for(j=0;j<8;j++) {

f1[m]=(double)(FkGray[k][i][j]*Q_table[m]); m++; } }

fidct_2D(f1,3,3); //二维DCT反变换 m=0;

i_start = (k/64)*8; //整数商×8

for(i=0;i<8;i++) //将子块合并为整个图像 {

j_start = (kd)*8; //整余数×8 for(j=0;j<8;j++) {

Gray[i_start][j_start]=(BYTE)(f1[m]); m++;

j_start++; }

i_start++; } } //

for(i=511;i>0;i--) for(j=0;j<512;j++) {

*lpDst=Gray[i][j]; lpDst++; }

///////////////////////////////////////////////////////////////////////////////

nTotal = 512*512;//返回编码后的图像字节数

return 1; }

///////////////////////////////////////

//BOOL BMPToMyPcx(BYTE *lpDIBBits,LONG lSrcBytes,BYTE *lpDst,LONG lDstBytes)

//完成功能:将原BMP图像数据通过游程编码进行压缩

//输入参数:位图源图像象素的指针lpDIBBits,原图像数据长度lSrcBytes // 压缩后图像象素的指针lpDst,压缩后数据长度lDstBytes //返回参数:是否成功

///////////////////////////////////////

BOOL CDib::BMPToMyPcx(BYTE *lpDIBBits,LONG lSrcBytes,BYTE *lpDst,LONG &lpDstBytes) {

// 循环变量 LONG i; LONG j;

// DIB高度

WORD wHeight = 512;

// DIB宽度

WORD wWidth = 512;

// 中间变量 BYTE bChar1; BYTE bChar2;

// 图像每行的字节数

LONG lLineBytes = wWidth * 3;

// 重复像素计数 int iCount;

// 缓冲区已使用的字节数 DWORD dwBuffUsed; //

BYTE *lpSrc;

//******************************************************************************* // 开始编码

// 开辟一片缓冲区(2被原始图像大小)以保存编码结果 lpDst = new BYTE[wHeight * wWidth * 2];

// 指明当前已经用了多少缓冲区(字节数) dwBuffUsed = 0;

// 每行

for (i = 0; i < wHeight; i++) {

// 指向DIB第i行,第0个象素的指针

lpSrc = lpDIBBits + lLineBytes * (wHeight - 1 - i);

// 给bChar1赋值 bChar1 = *lpSrc;

// 设置iCount为1 iCount = 1;

// 剩余列

for (j = 1; j < wWidth; j ++) {

// 指向DIB第i行,第j个象素的指针 lpSrc++;

// 读取下一个像素 bChar2 = *lpSrc;

// 判断是否和bChar1相同并且iCount < 63 if ((bChar1 == bChar2) && (iCount < 63)) {

// 相同,计数加1

iCount ++;

// 继续读下一个 } else {

// 不同,或者iCount = 63

// 写入缓冲区

if ((iCount > 1) || (bChar1 >= 0xC0)) {

// 保存码长信息

lpDst[dwBuffUsed] = iCount | 0xC0;

// 保存bChar1

lpDst[dwBuffUsed + 1] = bChar1;

// 更新dwBuffUsed dwBuffUsed += 2; } else {

// 直接保存该值

lpDst[dwBuffUsed] = bChar1;

// 更新dwBuffUsed dwBuffUsed ++; }

// 重新给bChar1赋值 bChar1 = bChar2;

// 设置iCount为1 iCount = 1; } }

// 保存每行最后一部分编码

if ((iCount > 1) || (bChar1 >= 0xC0)) {

// 保存码长信息

lpDst[dwBuffUsed] = iCount | 0xC0;

// 保存bChar1