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

📄 jr.cpp

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

	Created:	2006/12/11 12:32
	FileName: 	JR.cpp
	Author:		Jar 包杰
	
	Purpose:	读取显示J压缩文件,并转换为24位BMP图像
	
	  Copyright By Jar 2006.12
*********************************************************************/
#include "stdafx.h"
#include "JR.h"

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

CJR::CJR() 
{
	FileName = "";
	FilePath = "";
	m_pBMFH = NULL;
	m_pBMIH = NULL;
	m_pBits = NULL;
	m_pJFH = NULL;
}

CJR::~CJR()
{
	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:		JRead
Description:	读取J文件头
Input:			CFile *pFile
Output:         
Return:			BOOL 成功返回TRUE,否则返回FALSE
Others:			读取J文件头,写BMP文件头和信息头
*************************************************/
BOOL CJR::JRead(CFile *pFile)
{
	int nSize;
	//创建J文件头
	nSize = sizeof(JFILEHEADER);
	m_pJFH = (LPJFILEHEADER) new BYTE[nSize];

	//读取文件头
	pFile->Read(m_pJFH, sizeof(JFILEHEADER));
	// 判断是否是J格式的压缩图像
	if(m_pJFH->JType != J_HEADER_MARKER)
		return FALSE;
	FilePath = pFile->GetFilePath();
	FileName = pFile->GetFileName() + ".bmp";

	///////////////////////////////////////////////////////////////////////////
	//写BMP文件头和信息头
	m_pBMFH = new BITMAPFILEHEADER;
	m_pBMIH = new BITMAPINFOHEADER;
	m_pBMFH->bfType = BMP_HEADER_MARKER;
	m_pBMFH->bfReserved1 = 0;
	m_pBMFH->bfReserved1 = 0;
	m_pBMFH->bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + m_pJFH->JHeight * (m_pJFH->JWidth * 3 + (4 - m_pJFH->JWidth * 3 % 4));
	m_pBMFH->bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
	m_pBMIH->biSize = sizeof(BITMAPINFOHEADER);
	m_pBMIH->biWidth = m_pJFH->JWidth;
	m_pBMIH->biHeight = m_pJFH->JHeight;
	m_pBMIH->biPlanes = 1;
	m_pBMIH->biBitCount = 24;
	m_pBMIH->biCompression = 0;
	m_pBMIH->biSizeImage = m_pBMFH->bfSize - m_pBMFH->bfOffBits;
	m_pBMIH->biXPelsPerMeter = 3780;
	m_pBMIH->biYPelsPerMeter = 3780;
	m_pBMIH->biClrUsed = 0;
	m_pBMIH->biClrImportant = 0;
	m_pBits = new BYTE[m_pBMIH->biSizeImage];
	///////////////////////////////////////////////////////////////////////////

	return TRUE;
}

/*************************************************
Function:		JDraw
Description:	显示J压缩图像
Input:			*pDC
Output:         
Return:			BOOL 成功返回TRUE,否则返回FALSE
Others:			读取J文件数据并显示
				转换为24位BMP文件
*************************************************/
BOOL CJR::JDraw_BMPCreate(CDC *pDC)
{
	CString s;
	pDC->TextOut(0,0,"Completed ");
	s.Format("Height = %d pix",m_pJFH->JHeight);
	pDC->TextOut(0,20,s);
	s.Format("Width = %d pix",m_pJFH->JWidth);
	pDC->TextOut(0,40,s);
	s.Format("FirstColor = RGB(%d,%d,%d)",m_pJFH->FirstColor[0],m_pJFH->FirstColor[1],m_pJFH->FirstColor[2]);
	pDC->TextOut(0,60,s);
	s.Format("SecondColor = RGB(%d,%d,%d)",m_pJFH->OpposeColor[0],m_pJFH->OpposeColor[1],m_pJFH->OpposeColor[2]);
	pDC->TextOut(0,80,s);

	//创建文件
	CFile JFile,BMPFile;
	JFile.Open(FilePath,CFile::modeRead);
	JFile.Seek(sizeof(JFILEHEADER),CFile::begin);
	BMPFile.Open(FileName,CFile::modeCreate|CFile::modeWrite);

	///////////////////////////////////////////////////////////////////////////
	//写BMP文件的文件头和信息头
	BMPFile.Write(m_pBMFH,sizeof(BITMAPFILEHEADER));
	BMPFile.Write(m_pBMIH,sizeof(BITMAPINFOHEADER));
	LPBYTE tmph_m_pBits = m_pBits;	//临时存放BMP数据区首地址
	///////////////////////////////////////////////////////////////////////////

	//读取压缩数据并显示
	int i = 0,j = 0,k = 0;
	int nSize = m_pJFH->JHeight * m_pJFH->JWidth;
	WORD tmp;
	WORD n = -1;
	JFile.Read(&tmp,sizeof(WORD));
	for (i = 0;i < m_pJFH->JHeight;i++)
	{
		for (j = 0;j < m_pJFH->JWidth;j++)
		{
			if (k%2 == 1) 
			{
				pDC->SetPixel(j,m_pJFH->JHeight-i+100,RGB(m_pJFH->FirstColor[0],m_pJFH->FirstColor[1],m_pJFH->FirstColor[2]));
				*m_pBits++ = m_pJFH->FirstColor[2];
				*m_pBits++ = m_pJFH->FirstColor[1];
				*m_pBits++ = m_pJFH->FirstColor[0];
			}
			else 
			{
				pDC->SetPixel(j,m_pJFH->JHeight-i+100,RGB(m_pJFH->OpposeColor[0],m_pJFH->OpposeColor[1],m_pJFH->OpposeColor[2]));
				*m_pBits++ = m_pJFH->OpposeColor[2];
				*m_pBits++ = m_pJFH->OpposeColor[1];
				*m_pBits++ = m_pJFH->OpposeColor[0];
			}
			n++;
			if (n == tmp)
			{
				n = 0;
				k++;
				JFile.Read(&tmp,sizeof(WORD));
			}
			s.Format("%d %%",(i * m_pJFH->JWidth + j) * 100 / nSize);
			pDC->TextOut(75,0,s);
		}
		m_pBits = m_pBits + m_pBMIH->biWidth % 4;
	}
	m_pBits = tmph_m_pBits;

	BMPFile.Write(m_pBits,m_pBMIH->biSizeImage);

	JFile.Close();
	BMPFile.Close();

	s = "Uncompressed to " + FileName;
	pDC->TextOut(0,0,s);

	return TRUE;
}

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

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

⌨️ 快捷键说明

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