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

📄 j.cpp

📁 一种二值图象无损压缩算法 南京理工大学电光学院 【摘 要】利用稀疏矩阵和差分编码对二色图像进行压缩保存
💻 CPP
字号:
/********************************************************************

	Created:	2006/12/09 12:32
	FileName: 	BMP.cpp
	Author:		Jar 包杰
	
	Purpose:	将24位BMP二色图像文件压缩
	
*********************************************************************/
#include "stdafx.h"
#include "J.h"

// 声明串行化过程
IMPLEMENT_SERIAL(CJ, CObject, 0);

CJ::CJ() 
{
	JFileName = "";
	m_pBMFH = NULL;
	m_pBMIH = NULL;
	m_pBits = NULL;
	m_pJFH = NULL;
}

CJ::~CJ()
{
	if (m_pBMFH != NULL)
	{
		delete m_pBMFH;
		m_pBMFH = NULL;
	}
	if (m_pBMIH != NULL)
	{
		delete m_pBMIH;
		m_pBMIH = NULL;
	}
	if(m_pBits != NULL)
	{
		m_pBits = NULL;
	}
	if(m_pJFH != NULL)
	{
		m_pJFH = NULL;
	}
}

/*************************************************
Function:		Read
Description:	读取BMP图像
Input:			CFile *pFile
Output:         
Return:			BOOL 成功返回TRUE,否则返回FALSE
Others:			读取BMP文件头、信息头和图像数据 
*************************************************/
BOOL CJ::BMPRead(CFile *pFile)
{
	int nSize = sizeof(BITMAPFILEHEADER);
	m_pBMFH = (LPBITMAPFILEHEADER) new BYTE[nSize];

	//创建J文件头
	nSize = sizeof(JFILEHEADER);
	m_pJFH = (LPJFILEHEADER) new BYTE[nSize];

	//读取文件头
	pFile->Read(m_pBMFH, sizeof(BITMAPFILEHEADER));
	// 判断是否是BMP格式的位图
	if(m_pBMFH->bfType != BMP_HEADER_MARKER)
		return FALSE;

	nSize = sizeof(BITMAPINFOHEADER);
	m_pBMIH = (LPBITMAPINFOHEADER) new BYTE[nSize];

	//生成.J文件名
	JFileName=pFile->GetFileName()+".j02";

	//读取信息头
	pFile->Read(m_pBMIH, sizeof(BITMAPINFOHEADER));
	//非24位图像打开失败
	if (m_pBMIH->biBitCount != 24)
		return FALSE;

	//读取图象数据
	m_pBits = (LPBYTE) new BYTE[m_pBMIH->biSizeImage];
	pFile->Read(m_pBits, m_pBMIH->biSizeImage);

	return TRUE;
}

/*************************************************
Function:		JWrite
Description:	压缩BMP图像
Input:			*pDC
Output:         
Return:			BOOL 成功返回TRUE,否则返回FALSE
Others:			第一次扫描将BMP图像转换成二值矩阵,只含'0''1'
				
*************************************************/
bool CJ::JWrite(CDC *pDC)
{
	int i,j;
	BYTE *DivMatrixH,*DivMatrix;
	DivMatrix = new BYTE[m_pBMIH->biHeight*m_pBMIH->biWidth];	//二值矩阵
	LPBYTE BitsH = m_pBits;
	DivMatrixH = DivMatrix;	//标记数据区开始,防止刷新时越界

	m_pJFH->JType = J_HEADER_MARKER;
	m_pJFH->JHeight = (WORD)m_pBMIH->biHeight;
	m_pJFH->JWidth = (WORD)m_pBMIH->biWidth;
	for (i = 0;i<3;i++)
		m_pJFH->FirstColor[i] = *(m_pBits+i);

	//转换成二值矩阵
	for (i = 0;i<m_pBMIH->biHeight;i++)
	{
		for (j = 0;j<m_pBMIH->biWidth;j++)
		{
			BYTE tmp = *m_pBits++;
			m_pBits++;m_pBits++;
			if (tmp == m_pJFH->FirstColor[0]) 
				*DivMatrix++ = 1;
			else *DivMatrix++ = 0;
		}
		m_pBits = m_pBits+m_pBMIH->biWidth%4;
	}
	m_pBits = BitsH;
	DivMatrix = DivMatrixH;

	WORD FirstDis = 0;	//定义第一次出现颜色跳变的偏移量
	do{
		FirstDis++;
		DivMatrix++;
	}while (*DivMatrix != *(DivMatrix-1));


	CFile JFile;
	JFile.Open(JFileName,CFile::modeCreate|CFile::modeReadWrite);
	JFile.Write(m_pJFH,sizeof(JFILEHEADER));
	JFile.Write(&FirstDis,sizeof(WORD));

	WORD tmp = FirstDis;	//
	BYTE tmpc;
	for (i = FirstDis;i<m_pBMIH->biHeight*m_pBMIH->biWidth;i++)
	{
		tmpc=*DivMatrix++;
		if (*DivMatrix != tmpc)
		{
			WORD Dis = i-tmp;
			JFile.Write(&Dis,sizeof(WORD));
			tmp = i;
		}
	}

	JFile.Close();
	return TRUE;
}

//串行化
void CJ::Serialize(CArchive &ar)
{
	BMPRead(ar.GetFile());
}

//获取文件头指针 
LPJFILEHEADER CJ::GetJFH()
{
	return m_pJFH;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -