一个奇怪的问题
如果位图的高度是正的,那么位图就是上下颠倒的,于是我写了这个函数
void CRainieBitmap::FlipBitmap()
{
int iEndLine=m_bmInfoHeader.biHeight>>1;
int iEnd=m_bmInfoHeader.biHeight-1;
if(iEnd<1)
return;
int iSize=m_bmInfoHeader.biWidth*m_bmInfoHeader.biBitCount>>3;
PBYTE pBuffer=(PBYTE)malloc(iSize);
for(int iBegin=0;iBegin<=iEndLine;++iBegin,--iEnd)
{
MoveMemory(pBuffer,(PBYTE)m_pBuffer+iSize*iBegin,iSize);
MoveMemory((PBYTE)m_pBuffer+iSize*iBegin,(PBYTE)m_pBuffer+iSize*iEnd,iSize);
MoveMemory((PBYTE)m_pBuffer+iSize*iEnd,pBuffer,iSize);
}
free(pBuffer);
}
这个函数是类内部的,m_pBuffer是像素缓冲,奇怪的是当我用这个函数来翻转一些很老的24位位图时完全没有问题,可是一旦翻转的是那些很精美的新式位图时,内存就溢出了,我试了很多BMP文件,都是这个问题?为什么啊
[解决办法]
你那样做的效率不高,不如直接把申请一块和位图一样大的内存存放原位图的拷贝,然后进行颠倒。
int FlipBitmap(BYTE* pBits,int iWidth,int iHeight,int iBytesPerPixel)
{
if(NULL==pBits)
return FALSE;
LONG lPitch=iWidth*iBytesPerPixel;
LONG lBytes=iHeight*lPitch;
BYTE* pBitsTemp=new BYTE[lBytes];
//创建副本
memcpy(pBitsTemp,pBits,lBytes);
for(int i=0;i<iHeight;i++)
memcpy(pBits+i*lPitch,pBitsTemp+(iHeight-1-i)*lPitch,lPitch);
delete[] pBitsTemp;
return TRUE;
}