其中,WritePart是主体函数,实现对图像的切割和输出,其他5个函数直接或间接被该函数调用。
4 算法实现
4.1 WritePart函数
// m_LU:切割矩形的左上顶点;m_RB:切割矩形的右下顶点;pFile:修改后图形的输//出文件
BOOL CDib::WritePart(const CPoint& m_LU, const CPoint& m_RB, CFile* pFile)
{
// (1) 修改BmpFileHeader结构
BITMAPFILEHEADER bmfh;
bmfh.bfType = 0x4d42; // 'BM'
int nSizeHdr = sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * m_nColorTableEntries;
bmfh.bfSize = 0;
bmfh.bfReserved1 = bmfh.bfReserved2 = 0;
bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +sizeof(RGBQUAD) * m_nColorTableEntries;
// (2) 修改BmpInfoHeader结构
// 存储时需要的字节数,每行需要拷贝的字节数,偏移量
// 原始图像的每行的起始字节、起始位,行末终止字节、终止位
int n_StartByte, n_StartBit, n_EndByte, n_EndBit;
// 原图像每行占的字节数、目标图像每行字节数,切割后图像的高度
int n_OriRowByte, n_DesRowByte, n_Height;
// 由原图像的biBitCount、切割矩形的左上、右下顶点位置,计算切割图像所需要的相关参数
GetParam(m_lpBMIH->biBitCount, m_LU, m_RB, n_StartByte, n_StartBit, n_EndByte, n_EndBit, n_OriRowByte, n_DesRowByte);
// 每次从原图像向目标图像拷贝时需处理的字节数
int n_CopyByte = n_EndByte - n_StartByte + 1;
n_Height = m_lpBMIH->biHeight;
|