//将数据放到各个子块 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