📄 dib.cpp
字号:
// Dib.cpp : 实现文件
//
#include "stdafx.h"
#include "Dib.h"
#include "S09_03.h"
// CDib
CDib::CDib()
{
m_pBMI = NULL;
m_pDIBData = NULL;
}
CDib::~CDib()
{
// 释放内存
if (m_pBMI != NULL)
delete m_pBMI;
if (m_pDIBData != NULL)
delete m_pDIBData;
}
// CDib 成员函数
BOOL CDib::LoadFromFile(LPCTSTR lpszFileName)
{
CFile file;
BITMAPINFO* pBMI = NULL;
BYTE* pDIBData = NULL;
// 打开指定的文件
if ( !file.Open(lpszFileName, CFile::modeRead | CFile::typeBinary) )
{
AfxMessageBox("打不开文件!");
return FALSE;
}
// 读入BMP文件头信息
BITMAPFILEHEADER bfh;
if ( file.Read(&bfh, sizeof(bfh)) != sizeof(bfh) )
{
AfxMessageBox("读文件出错!");
return FALSE;
}
// 若不是BMP位图,不予处理
if ( bfh.bfType != 0x4d42 ) // 'BM'
{
AfxMessageBox("不是BMP文件!");
return FALSE;
}
// 读入位图信息头
BITMAPINFOHEADER bih;
if ( file.Read(&bih, sizeof(bih)) != sizeof(bih) )
{
AfxMessageBox("读文件出错!");
return FALSE;
}
// 若不是24位真彩色位图,则不予处理
if ( bih.biBitCount != 24 )
{
AfxMessageBox("不是24位真彩色位图!");
return FALSE;
}
// 为BITMAPINFO结构指针申请内存,由于真彩色位图没有颜色表,所以
// 其BITMAPINFO = BITMAPINFOHEADER
pBMI = (BITMAPINFO*) new char[sizeof(BITMAPINFOHEADER)];
if ( !pBMI )
{
AfxMessageBox("分配内存出错!");
return FALSE;
}
// 由于前面已将BITMAPINFOHEADER读入了内存,所以这里只需拷贝一下
memcpy(pBMI, &bih, sizeof(BITMAPINFOHEADER));
// 为DIB图象数据指针申请内存
DWORD dataBytes = bfh.bfSize - bfh.bfOffBits; // 图象数据的字节数
pDIBData = (BYTE*) new char[dataBytes];
if ( !pDIBData )
{
AfxMessageBox("分配内存出错!");
delete pBMI;
return FALSE;
}
// 读入位图的图象数据
if ( file.Read(pDIBData, dataBytes) != dataBytes )
{
AfxMessageBox("读文件出错!");
delete pBMI;
delete pDIBData;
return FALSE;
}
file.Close();
if (m_pBMI != NULL)
delete m_pBMI;
m_pBMI = pBMI;
if (m_pDIBData != NULL)
delete m_pDIBData;
m_pDIBData = pDIBData;
return TRUE;
}
void CDib::ShowDIB(CDC* pDC, int nLeft, int nTop, int nWidth, int nHeight)
{
pDC->SetStretchBltMode(COLORONCOLOR); // 设置伸缩拷贝模式
StretchDIBits(pDC->GetSafeHdc(), // DC的句柄
nLeft, // 目标矩形左上角的X坐标
nTop, // 目标矩形左上角的Y坐标
nWidth, // 目标矩形的宽度
nHeight, // 目标矩形的高度
0, // 源矩形左上角的X坐标
0, // 源矩形左上角的Y坐标
GetDIBWidth(), // 源矩形的宽度
GetDIBHeight(), // 源矩形的高度
m_pDIBData, // 位图图象数据的地址
m_pBMI, // 位图信息结构地址
DIB_RGB_COLORS, // 标志选项
SRCCOPY); // 光栅操作码
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -