求大神帮我改一下代码,关于BMP图像压缩的 5C

分段不正确,也不知道哪里错了
#include "stdafx.h"
#include
#include
#include
#include"windows.h"
#include"WINGDI.h"//图形设备接口
using namespace std;

#define Imax 256
#define header 11//每段像素段标题固定信息所占位数

class Bitmap
{
public:
int m;//像素段数
int bmpwidth;//图像宽度
int bmpheight;//图像高度
int bitcount;//图像一个像素用多少位表示
int linebyte;//每行像素的字节数
unsigned char **theBMP;//先用二维数组读入位图信息
unsigned char *pBMP;//读入图像数据的数组
unsigned char *unpBMP;
char *filemsg;//存位图文件头信息
char *BMPmsg;//存位图信息头信息
int *s, *l, *b;//s[i]:表示从0到i压缩一共占多少存储空间,l[i]:第i个像素段有l[i]个像素点,b[i]:第i个像素段的每个像素点占b[i]个位数
BITMAPFILEHEADER fhead;//位图文件头
BITMAPINFOHEADER head;//位图信息头
RGBQUAD *colorTable;//颜色表指针
int length(int i);//计算整数的二进制长度
void traceback(int n, int *s, int *l);
void output(unsigned char *p,int *s, int *l, int *b);
void store(char *a, int *j, int *left, int bit, int temp);
void ReadBitmap(char *inFile);//读位图文件
void Compress(char *outComFile, unsigned char *p);//压缩

};
//计算整数的二进制长度
int Bitmap::length(int i)
{
int k = 1;
i = i / 2;
if (i > 0)
{
k++;
i = i / 2;
}
return k;
}
void Bitmap::traceback(int n, int s, int *l)
{
if (n <= 0)
return;
traceback(n - l[n], s, l);
s[m++] = n - l[n];//重新为s[]数组赋值,用来存储分段位置
}
void Bitmap::output(unsigned char *p, int *s, int *l, int *b)
{
int max;
int n = bmpheight*bmpwidth;
traceback(n, s, l);
s[m] = n;
for (int i = 1; i <= m; i++)
{
l[i] = l[s[i]];
max = -1;
for (int j = s[i - 1] + 1; j <= s[i]; j++)
{
if (length(p[j]) > max)
max = length(p[j]);
}
b[i] = max;
}
}
void Bitmap::store(char *a, int *j, int *left, int bit, int temp)
{
if (*left <= bit)
{
a[(*j)++] += temp >> (bit - (*left));
a[(*j)] += (temp << (8 + (*left) - bit)) & 0xff;
*left = 8 - (bit - (*left));
}
else
{
a[(*j)] += (temp << (*left - bit)) & 0xff;
*left -= bit;
}
}
void Bitmap::ReadBitmap(char *inFile)
{
ifstream infile(inFile,ios::binary);
if (!infile)
cerr << "open error!" << endl;
infile.read((char
)&fhead,sizeof(BITMAPFILEHEADER));//读入文件头信息,储存在fhead中
infile.read((char*)&head, sizeof(BITMAPINFOHEADER));//读入信息头信息,储存在head中
bmpheight = head.biHeight;
bmpwidth = head.biWidth;
bitcount = head.biBitCount;
linebyte = (bmpwidth * bitcount / 8 + 3) / 4 * 4;//保证每行的像素字节是4的倍数
if (bitcount == 8)
{
colorTable = new RGBQUAD[256];
infile.read((char*)colorTable, 256*sizeof(RGBQUAD));//读调色板信息并存入内存
}
infile.seekg(fhead.bfOffBits+1, ios::beg);//把文件读指针指到图片信息位置
theBMP = new unsigned char*[bmpheight];
for (int i = 0; i < bmpheight; i++)//像素信息存到二维数组里
{
theBMP[i] = new unsigned char[linebyte];
infile.read((char*)theBMP[i], linebyte);
}
pBMP = new unsigned char[linebyte*bmpheight + 1];//申请位图数据所需的空间,读位图数据进内存
int k = 1;
for (int i = 0; i < bmpheight; i++)//将图片数据蛇形读入数组pBMP
{
if (i % 2 == 0)
for (int j = 0; j < linebyte; j++)
pBMP[k++] = theBMP[i][j];
else
for (int j = linebyte - 1; j >= 0; j--)
pBMP[k++] = theBMP[i][j];
}
for (int i = 0; i < bmpheight; i++)
delete[]theBMP[i];
delete[]theBMP;
infile.close();
}
//l[i]:第i个像素段有l[i]个像素点,b[i]:第i个像素段的每个像素点占b[i]个位数
//s[i]:表示从0到i压缩一共占多少存储空间
void Bitmap::Compress(char outComFile ,unsigned char *p)
{
int size = bmpwidth*bmpheight;//图像的像素点数
int left = 8, k = 1, t;//
int bmax;
s = new int[size + 1];
l = new int[size + 1];
b = new int[size + 1];
s[0] = 0;
m = 1;//初始化段数
for (int i = 1; i <= size; i++)
{
b[i] = length(p[i]);
bmax = b[i];
s[i] = s[i - 1] + bmax;
l[i] = 1;
for (int j = 2; j <= i&&j <= Imax; j++)
{
if (bmax < b[i - j + 1])//找到该段每个像素点所占最大的位数
{
bmax = b[i - j + 1];
}
if (s[i] >(s[i - j] + j*bmax))//该段所用的最小储存位数,j是该段的像素点个数
{
s[i] = s[i - j] + j*bmax;
l[i] = j;
}
}
s[i] += header;
}
output(p, s, l, b);
ofstream outfile(outComFile, ios::binary);
if (!outfile)
cerr << "open error!" << endl;
char
compress_msg = new char[size+1];//储存压缩后的图像信息
for (int i = 0; i <= size; i++)
compress_msg[i] = 0;
int j = 0;
for (int i = 1; i <= m; i++)
{
store(compress_msg, &j, &left, 8, l[i] - 1);
store(compress_msg, &j, &left, 3, b[i] - 1);
t = k + l[i];
for (; k < t; k++)
{
store(compress_msg, &j, &left, b[i], p[k]);
}
}
head.biSizeImage = j + 1;
cout << j + 1;
outfile.write((char*)(&fhead), sizeof(BITMAPFILEHEADER));//写入文件头
outfile.write((char*)(&head), sizeof(BITMAPINFOHEADER));//写入信息头
outfile.write((char*)(&colorTable), strlen((char*)&colorTable));//写入调色板信息
outfile.write(compress_msg, j + 1);//写入压缩后的图片信息
outfile.close();
}
int main()
{
Bitmap test;
char *filename="截图.bmp";
char *outcomfile = "myComfile.txt";
test.ReadBitmap(filename);
test.Compress(outcomfile, test.pBMP);
return 0;
}

1个回答

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!

相似问题

1
求大神,求一个心形动态代码
0
ant解压包含word的压缩包后出现乱码,跪求大神帮帮小弟
1
微信开发,要上传图片。求大神帮我
1
有哪位图像处理大神对曲波的图像修复算法有所研究
0
求大神来为php代码解密
2
如何用SQL语句实现属性列的转换?求大神帮忙
1
我有一些MATLAB代码不懂什么意思求大神帮忙翻译一下,导师给的代码,我没学过,求大神帮忙翻译!
3
我有一些matlab代码,我没学过,求大神注释一下!
1
求大神帮我解决下这个mfc问题。能给我源代码么
4
新手:vs2012中如何连接数据库,求大神指教,最好有代码示例。谢谢。
5
新手:vs2012中如何连接mysql数据库,求大神指教,最好有代码示例。谢谢。
5
ssm maven shiro 求大神赐予我一个框架搭建的连接
8
初学JS求大神帮忙修改一下!
2
SSH中结合freemarker,在页面添加文章,添加完数据库显示路径“#”求大神指点该怎么改代码?
1
c# 禁用触摸板和触屏的缩放的代码?大神帮帮忙!
1
java web项目怎么清理没有用的图片资源?哪位大神帮我看一下,拜谢了!
7
SQL以a字段为条件,修改b字段为c字段中的一部分,求代码,求各路大神帮个忙在线等谢谢
7
我用的是zlib进行数据压缩与解压 但是总是莫名其妙的崩溃 异常0XC0000005 求大神帮解决下
7
请大神帮我看看我这光耦的画法对不对
2
在用matlab做图片的分解与重构,代码运行结果出不来,求大神指教(下附代码和结果)