4.4 CopyRow函数
// 将源图像的一行拷到目标图像中
BOOL CDib::CopyRow(LPBYTE m_lpSrc, LPBYTE m_lpDes, int n_CopyByte,
int n_StartBit, int n_EndBit, int n_DesRowByte)
{
if(n_CopyByte > n_DesRowByte){
AfxMessageBox("Error in Copy Row");
return FALSE;
}
LPBYTE m_lpMeta, m_pByteNow;
// 临时数据区
m_lpMeta = new BYTE[n_CopyByte];
memcpy(m_lpMeta, m_lpSrc, n_CopyByte);
BYTE m_BTemp = GetConstBYTE(n_EndBit);
// n_EndBit后的位赋0
*(m_lpMeta+n_CopyByte-1) &= m_BTemp;
// 调用数组移位操作函数
ArrayLeftBitMove(m_lpMeta, n_CopyByte, n_StartBit);
// 需拷贝最后一个字节
if(n_StartBit <= n_EndBit+1)
memcpy(m_lpDes, m_lpMeta, n_CopyByte);
// 移位后,最后一个字节的内容都已移到前一字节中
else
memcpy(m_lpDes, m_lpMeta, n_CopyByte-1);
delete [] m_lpMeta;
return TRUE;
}
该函数将原图像在切割矩形内的一行数据拷到目标图像中。为处理切割矩形中每行起始像素的起始位不是原图像中所在字节起始位的情况(n_StartBit不为0),先将该行数据拷到临时数据区m_lpMeta,将该行数据进行处理后,再拷贝到目标图像中。
m_lpSrc:目标图像该行在原图像中的起始位置;m_lpDes:目标图像该行的起始位置;n_StartBit:该行起始位在原图像中相应字节中的位置;n_EndBit:该行末位在原图像中相应字节中的位置;n_DesRowByte:目标图像中每行占用的字节数。
|