下面程序我自己编的针对24位BMP位平面分解与显示的程序,其中位平面分解函数是改动的一个处理8位灰度图像的一个api函数,但是结果只能处理一副图像的一半还不知道处理的对不对,并且只能到第8副图像,(应该有24副吧),求各位大神帮忙看看,代码如下:
BOOL Crenwu1_1View::DIBBITPLANE(CDib * pDib, BYTE bBitNum)
{
// 如果输入的数不符合要求,不进行分解
if(bBitNum <1 || bBitNum >24)
return FALSE;

// 指向源图像的指针
BYTE * lpSrc; //图象的宽度和高度
LONG    lWidth;
LONG    lHeight; // 图像每行的字节数
LONG lLineBytes;

// 循环变量
LONG i;
LONG j; // 中间变量
BYTE bTemp;
BYTE bA; // 二进制第i位对应的十进制值
BYTE bCount;

//得到图象的宽度和高度
CSize   SizeDim;
SizeDim = pDib->GetDimension();
lWidth  = SizeDim.cx;
lHeight = SizeDim.cy;

//得到实际的Dib图象存储大小
CSize   SizeRealDim;
SizeRealDim = pDib->GetDibSaveDim(); // 计算图像每行的字节数
lLineBytes = SizeRealDim.cx;

//图像数据的指针
LPBYTE  lpDIBBits = pDib->m_lpData;

bCount = 1<<(bBitNum - 1);

for (i = 0; i<lHeight; i++)
{
for ( j = 0; j < lWidth; j++)
{
// 指向位图i行j列的指针
lpSrc = (BYTE *)lpDIBBits + j+lLineBytes * (lHeight - 1 - i); // 对位图按灰度码进行分解
if(bBitNum == 8)
{
// 如果求的是位图24,直接取二值的第2^24位
bTemp = (*(lpSrc) & bCount) / bCount;
bTemp=bTemp*255;//test1
//bTemp = bTemp * (2^24-1);//test1
}
else
{
// 否则进行异或,求得灰度码
bTemp = (*(lpSrc) & bCount) / bCount;
bA    = bCount * 2; // 第i+1位图的象素值
bA = (*(lpSrc) & bA) / bA; // 异或
//bTemp = (bTemp ^ bA) * (2^24-1);//test1
bTemp=(bTemp ^ bA) *255;//test1
} // 更新源图象
*(lpSrc) = bTemp;
}
} // 返回值
return TRUE;
}void Crenwu1_1View::OnCodingBitplane()
{
CDlgBitPlane dlgCoding;
dlgCoding.DoModal();
BYTE bBitNum = dlgCoding.m_BItNumber;
Crenwu1_1Doc * pDoc = GetDocument();
CDib * pDib = pDoc->m_pDibInit;



//LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBmpInfoHeader;(这句没用了) /* 判断是否是24-bmp位图(这里为了方便,只处理24-bmp位图的位平面分解)*/
if (Cdib.GetBitCount() != 24)
{
// 提示用户
MessageBox("目前只支持24位图的位平面分解!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);

// 返回
return;
}
DIBBITPLANE(&Cdib,dlgCoding.m_BItNumber);
//statedoc=1; // 设置脏标记
pDoc->SetModifiedFlag(TRUE);

// 更新视图
pDoc->UpdateAllViews(NULL);
// TODO: 在此添加命令处理程序代码
}这是第一位平面这是第8位平面
谢谢!!