位图转区域
大狗狗 2007-12-03 10:21:38 在网上看到一段位图转区域的代码,实在看不明白:
"创建一个区域是调用SDK 的ExtCreateRegion 来实现( MFC 中的对应函数为CRgn::CreateFromData)。这个函数是通过提供一个矩形数组, 来创建一个由这些矩形组成的区域。"
CDib m_dib ;
CRgn m_rgn ;
COLORREF m_dwColorKey = 0x0000ff; // 透明色, 纯蓝
BOOL CAswDlg::CreateRegionFromBmp( LPCSTR lpsFName )
{
// 读入位图
if( !m_dib.Open( lpsFName ) )
return FALSE ;
SIZE dibsize ;
// 获取位图尺寸
dibsize = m_dib.GetSize( ) ;
int i , j ;
BOOL bkey ;
int iCount = 0 ;
// 统计需要的矩形个数
for( i = 0 ; i < dibsize.cy ; i ++)
{
bkey = TRUE ;
for( j = 0 ; j < dibsize.cx ; j ++)
{
if( m_dib.GetPixel( j , i ) == m_dwColorKey )
{
bkey = TRUE ; }
else
{
if( bkey ) {
iCount ++;
}
bkey = FALSE ; }
}
}
由于 bkey 的存在,我实在搞不懂上面那段代码的逻辑,下面的代码也就看不下去了. bkey 起什么作用啊,这里面包含了什么原理?
BYTE *pData ;
RGNDATA *pRgnData ;
RECT *pRect ;
int iIndex = 0 ;
pData = new BYTE[ sizeof
( RGNDATAHEADER ) +sizeof( RECT ) *iCount ] ;
pRgnData = ( RGNDATA *)pData ;
pRect = ( RECT *)( pData +sizeof( RGNDATAHEADER ) ) ;
pRgnData ->rdh.dwSize =sizeo(RGNDATAHEADER ) ;
pRgnData ->rdh.iType =RDH_RECTANGLES ;
pRgnData ->rdh.nCount = iCount ;
pRgnData ->rdh.nRgnSize = sizeof( RECT ) *iCount ;
pRgnData ->rdh.rcBound.left = 0 ;
pRgnData ->rdh.rcBound.top = 0 ;
pRgnData ->rdh.rcBound.right =dibsize.cx ;
pRgnData ->rdh.rcBound.bottom = dibsize.cy ;
int iLeft = 0 ;
for( i = dibsize.cy -1 ; i >= 0 ; i --)
// 因为Bitmap 位图在Y 方向是颠倒
的所以要从底部开始
{
bkey = TRUE ;
iLeft = -1 ;
for( j = 0 ; j < dibsize.cx ; j ++)
{
if( m_dib.GetPixel( j , i ) == m_dwColorKey )
{
if( !bkey )
{
pRect[ iIndex ].left = iLeft ;
pRect[ iIndex ].right = j ;
pRect[ iIndex ].top = dibsize.cy -i -1 ;
pRect[iIndex].bottom = dibsize.cy -i;
bkey = TRUE ;
iIndex ++;
iLeft = -1 ;
}
}
else
{
if( bkey )
{
iLeft = j ;
bkey = FALSE ;
}
}
}
if( iLeft >= 0 )
{
pRect[ iIndex ].left = iLeft ;
pRect[ iIndex ].right = dibsize.cx ;
pRect[ iIndex ].top = i ;
pRect[ iIndex ].bottom = i ;
iIndex ++;
}
}
BOOL br = m_rgn.CreateFromData
( NULL , sizeof( RGNDATAHEADER ) +sizeof
( RECT ) *iCount , pRgnData ) ;
return br ;
}