⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bitmapzip.cpp

📁 自己写的huffman压缩 自己写的huffman压缩 自己写的huffman压缩
💻 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 + -