📄 bmp.cpp
字号:
/********************************************************************
Created: 2006/12/09 12:32
FileName: BMP.cpp
Author: Jar 包杰
Purpose: 读BMP+显示功能+压缩成J文件
*********************************************************************/
#include "stdafx.h"
#include "BMP.h"
// 声明串行化过程
IMPLEMENT_SERIAL(CBmp, CObject, 0);
CBmp::CBmp()
{
m_pBMFH = NULL;
m_pBMIH = NULL;
m_pBits = NULL;
}
CBmp::~CBmp()
{
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;
}
}
/*************************************************
Function: Read
Description: 读取BMP图像
Input: CFile *pFile
Output:
Return: BOOL 成功返回TRUE,否则返回FALSE
Others: 读取BMP文件头、信息头和图像数据
*************************************************/
BOOL CBmp::BMPRead(CFile *pFile)
{
int nSize = sizeof(BITMAPFILEHEADER);
m_pBMFH = (LPBITMAPFILEHEADER) 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()+".j";
//读取信息头
pFile->Read(m_pBMIH, sizeof(BITMAPINFOHEADER));
//读取图象数据
m_pBits = (LPBYTE) new BYTE[m_pBMIH->biSizeImage];
pFile->Read(m_pBits, m_pBMIH->biSizeImage);
return TRUE;
}
//显示图像和压缩图像
void CBmp::BMPDraw_JWrite(CDC *pDC)
{
int i,j;
LPBYTE tmpBit = m_pBits; //标记数据区开始,防止刷新时越界
CString s;
s.Format("Size = %d Byte",m_pBMFH->bfSize);
pDC->TextOut(0,0,s);
s.Format("Width = %d pix",m_pBMIH->biWidth);
pDC->TextOut(0,20,s);
s.Format("Height = %d pix",m_pBMIH->biHeight);
pDC->TextOut(0,40,s);
s.Format("成功压缩!");
pDC->TextOut(0,60,s);
for (i = 0;i<m_pBMIH->biHeight;i++)
{
for (j = 0;j<m_pBMIH->biWidth;j++)
{
BYTE b = *m_pBits++;
BYTE g = *m_pBits++;
BYTE r = *m_pBits++;
pDC->SetPixel(j,m_pBMIH->biHeight-i+80,RGB(r,g,b));
}
m_pBits = m_pBits+m_pBMIH->biWidth%4;
}
m_pBits = tmpBit;
//创建压缩的.J文件
CFile JFile;
if(!JFile.Open(JFileName,CFile::modeReadWrite))
{
JFile.Open(JFileName,CFile::modeCreate|CFile::modeReadWrite);
}
//写入J文件头
int nSize = sizeof(JFILEHEADER);
m_pJFH = (LPJFILEHEADER) new BYTE[nSize];
m_pJFH->JType = J_HEADER_MARKER;
m_pJFH->JHeight = (WORD)m_pBMIH->biHeight;
m_pJFH->JWidth = (WORD)m_pBMIH->biWidth;
JFile.Write(m_pJFH, sizeof(JFILEHEADER));
//第一次扫描文件
for (i = 0;i<m_pBMIH->biHeight;i++)
{
for (j = 0;j<m_pBMIH->biWidth;j++)
{
BYTE b = *m_pBits++;
BYTE g = *m_pBits++;
BYTE r = *m_pBits++;
if (r==0)
{
JFile.Write(&i, sizeof(int));
JFile.Write(&j, sizeof(int));
}
}
m_pBits = m_pBits+m_pBMIH->biWidth%4;
}
m_pBits = tmpBit;
JFile.Close();
}
//串行化
void CBmp::Serialize(CArchive &ar)
{
BMPRead(ar.GetFile());
}
//获取信息头指针
LPBITMAPINFOHEADER CBmp::GetBMIH()
{
return m_pBMIH;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -