📄 bitmapzip.cpp
字号:
#include "StdAfx.h"
#include "BitMapZip.h"
CBitMapZip::CBitMapZip(void)
{
}
CBitMapZip::~CBitMapZip(void)
{
}
bool CBitMapZip::GetPathFro(CString& path)
{
m_Path=path;
return 1;
}
bool CBitMapZip::GetPathTo(CString& path)
{
m_dePath=path;
return 1;
}
byte CBitMapZip::Wide(byte num)//应该比求开方省时
{
if(num&0x80)
return 8;
else if(num&0x40)
return 7;
else if(num&0x20)
return 6;
else if(num&0x10)
return 5;
else if(num&0x8)
return 4;
else if(num&0x4)
return 3;
else if(num&0x2)
return 2;
else if(num&0x1)
return 1;
else
return 0;
}
int CBitMapZip::Zip()
{
CFile filefrom;
if(!filefrom.Open(m_Path,CFile::modeRead))
AfxMessageBox(_T("打不开文件"));
BITMAPFILEHEADER bitmapfileheader;
BITMAPINFOHEADER bitmapinfoheader;
DWORD dataSize;
filefrom.Read(&bitmapfileheader,sizeof(BITMAPFILEHEADER));
filefrom.Read(&bitmapinfoheader,sizeof(BITMAPINFOHEADER));
dataSize=bitmapfileheader.bfSize-bitmapfileheader.bfOffBits;
m_width=bitmapinfoheader.biWidth;
m_height=bitmapinfoheader.biHeight;
m_count=bitmapinfoheader.biBitCount;
if(m_count!=8)
{
AfxMessageBox(_T("不可处理"));
return 0;
}
RGBQUAD *entry;
entry=new RGBQUAD[256];
filefrom.Read(entry,256*sizeof(tagRGBQUAD));
byte* bmpdata;
bmpdata=new byte[dataSize];
filefrom.Read(bmpdata,dataSize);
DWORD count=0;
for(DWORD i=0;i<dataSize;i++)
{
if(bmpdata[i]>15)
count++;
}
if(count>=dataSize/2)
{
for(DWORD i=0;i<dataSize;i++)
bmpdata[i]=255-bmpdata[i];
}
byte* bitPerP=new byte[dataSize];
byte* SegLen=new byte[dataSize];
for(UINT i=0;i<dataSize;i++)
SegLen[i]=0;
SegLen[0]=Wide(bmpdata[0]);
/*for(int i=0;i<datasize;i++)
{
}*/
//Vbits(wide,SegLen,m,s,kay);
return 0;
}
bool CBitMapZip::ReZip()
{
return 0;
}
void CBitMapZip::Vbits(BYTE l[], BYTE b[], int n, int s[], int kay[])
{
int *pl=new int[n+1];
int *pb=new int[n+1];
for(int i=n;i>0;i--)
{
pl[i]=l[i-1]+1;
pb[i]=b[i-1]+1;
}
int L = 256, header = 11;
s[0] = 0;
for (int i = 1; i <= n; i++) {
int lsum = pl[i],
bmax = pb[i];
s[i] = s[i - 1] + lsum * bmax;
kay[i] = 1;
for (int k = 2; k <= i && lsum+pl[i-k+1] <= L; k++)
{
lsum += pl[i-k+1];
if (bmax < pb[i-k+1]) bmax = pb[i-k+1];
if (s[i] > s[i-k] + lsum * bmax) {
s[i] = s[i-k] + lsum * bmax;
kay[i] = k;}
}
s[i] += header;
}
for(int i=0;i<n;i++)
{
kay[i]=kay[i+1];
l[i]=pl[i+1]-1;
b[i]=pb[i+1]-1;
}
delete []pl;
delete []pb;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -