我打开了一副24位的图片,不对它进行任何操作,只是另存为,然后查看刚存完图片的属性的位深竟然变成了32位的,这是为什么?(打开一副图片后会显示在左右2个视图里。)以下是我的代码。谢谢各位!!!!/*==================打开命令=========================*/
void CFingerVeinDoc::OnFileOpen() 
{
// TODO: Add your command handler code here
POSITION Pos;
CString leftimage,str1;
CString rightimage;
CFileDialog openFileDlg(true);
openFileDlg.m_ofn.Flags |= OFN_ALLOWMULTISELECT;//允许选择多幅图像
char* path;
BitmapData bitmapData;
int dirlen;
CString cst = " ";
unsigned short* imgdir;
CMessageWnd* pMessageWnd = GetMessageWnd();
if(openFileDlg.DoModal() == IDOK)
{
Pos = openFileDlg.GetStartPosition();//打开一幅图片时pos为空
leftimage = openFileDlg.GetNextPathName(Pos);
         path = leftimage.GetBuffer(leftimage.GetLength());//为一个CString对象重新获取其内部字符缓冲区的指针,返回的LPTSTR为非const的,从而允许直接修改CString中的内容!
CString str=path;
LPCTSTR   lp   =   (LPCTSTR)str;//   
 dirlen = MultiByteToWideChar(CP_ACP, 0 , leftimage, -1, NULL, 0);//转换成宽字符需要的空间
imgdir = (unsigned short*)malloc(dirlen*sizeof(WCHAR));//转换成宽字符的首地址
MultiByteToWideChar(CP_ACP, 0, leftimage, -1, imgdir, dirlen);
if(m_LeftImg != NULL)
{
delete [] m_LeftImg;
m_LeftImg = NULL;
}
m_hDIB = ReadDIBFile(lp);
   InitDIBData();
//m_LeftImg = Bitmap::FromFile(imgdir);//读入左边的图像
 if(imgdir != NULL)
{
delete [] imgdir;
imgdir = NULL;
}// FV_Width = m_LeftImg->GetWidth();
// FV_Height = m_LeftImg->GetHeight();
if(Pos != NULL)
{
rightimage = openFileDlg.GetNextPathName(Pos); dirlen = MultiByteToWideChar(CP_ACP, 0 , rightimage, -1, NULL, 0);
imgdir = (unsigned short*)malloc(dirlen*sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, rightimage, -1, imgdir, dirlen);
if(m_RightImg != NULL)
{
delete [] m_RightImg;
m_RightImg = NULL;
}
m_RightImg = Bitmap::FromFile(imgdir);//读入右边的图像
if(imgdir != NULL)
{
delete [] imgdir;
imgdir = NULL;
} FV_Width = m_RightImg->GetWidth();
FV_Height = m_RightImg->GetHeight();
if(Pos != NULL)
{
::AfxMessageBox("您选择了过多的指纹图像,这里将只显示前两幅");
return;
}
m_IsMatch = true;//打开了两幅图像,用于匹配 }
else m_IsMatch = false;//打开了一幅图像,用于提取细节点
if(m_IsMatch)
{
if(!Match(leftimage, rightimage))
AfxMessageBox(_T("显示图像失败!"));
}
else
{
if(GetMinutiae(leftimage) != TRUE)
{
AfxMessageBox(_T("显示图像失败!"));
return;
}
//path = new char[leftimage.GetLength()];

//  FV_ImgData = (BYTE *)leftimage;

if(FV_ImgData != NULL)
{
free(FV_ImgData);
FV_ImgData = NULL;
}
// if(!FV_OpenFile(path, &FV_ImgData, &FV_Width, &FV_Height))
// {
// AfxMessageBox("读入图像数据失败!");
// //delete [] path;
// return;
// }

Rect rt(0, 0, FV_Width, FV_Height);
m_OrgImg->LockBits( rt, ImageLockModeRead|ImageLockModeWrite, UnitPixel, &bitmapData);//获得临时数据
//  m_OrgImg->LockBits( rt, ImageLockModeRead|ImageLockModeWrite, UnitPixel, &bitmapData);//获得临时数据
m_OrgImg->UnlockBits(&bitmapData);


}
}
}
void CFingerVeinDoc::OnFileSaveAs() 
{
// TODO: Add your command handler code here
LPSTR lpDIB; 
LPBITMAPINFOHEADER  lpBI; 
CString str1; // TODO: Add your command handler code here
int dirlen;
unsigned short* savedir;
CFileDialog dlg(false,_T("bmp"),NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, ("位图(*.bmp)|*.bmp"));
dlg.DoModal();
CLSID clsid;
GetCodecClsid(L"image/bmp", &clsid);
CFingerVeinView* pView;
pView=(CFingerVeinView*)((CMainFrame *)AfxGetMainWnd())->m_wndSplitterUp.GetPane(0,0);
CString str = dlg.GetPathName();//可以得到完整的路径名
dirlen = MultiByteToWideChar(CP_ACP, 0 , str, -1, NULL, 0);
savedir = (unsigned short*)malloc(dirlen*sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, str, -1, savedir, dirlen);
pView->m_ShowImg->Save(savedir, &clsid);
DWORD err=GetLastError();
//
HDIB hDIB = m_hDIB;
lpDIB = (LPSTR)::GlobalLock((HGLOBAL) hDIB);//锁定内存块,参数hMem,指定一个全局内存块的句柄, 如果函数执行成功,返回值就是指向内存对象首字节指针,否则返回NULL 
lpBI  =  (LPBITMAPINFOHEADER)lpDIB; 
str1.Format("%d",lpBI->biBitCount);
AfxMessageBox(str1); }