MFC/VC++中怎样将一个位图添加到数据库中并且将其读出来到指定的Picture控件上

这篇博客介绍了如何在MFC/VC++中读取位图文件,将其存储到数据库(如Access和SQL Server)中,并从数据库中读取出来显示到Picture控件上。文章提供了详细的代码示例,包括位图信息的读取、转换、存储和读取过程,涉及到CFile、SAFEARRAY和VARIANT等技术。
摘要由CSDN通过智能技术生成

看这篇文章之前建议先看一下下面这篇文章:

VC下显示位图的几种方法   http://blog.chinaunix.net/uid-607545-id-2088102.html或  http://blog.csdn.net/ply421600/article/details/6692967 和http://hi.baidu.com/vbcs003/item/efffa6e775cdf80d8d3ea89a或http://blog.csdn.net/eryadabendan/article/details/6749939

修改了一下-----VC下显示位图的几种方法 中 的/*******************通过读取位图文件来显示位图**********************/


既然是向数据库中添加位图信息,那么有必须明白我们的数据是以什么形式存放在数据库的,当然没有别的方法,只能是二进制了,所以在创建数据库的时候,一定要注意选择的字段的类型,不然是添加下进去的。(刚开始的时候,我就遇到了这个问题,费了好长时间才搞定的。Access中的字段定义为” OLE 对象”,sql2000中字义为image就行了。

void CTestDlg::OnButton2() //读取位图文件并显示在picture控件上
{
    // TODO: Add your control notification handler code here
//    CStatic *pStatic=(CStatic*)GetDlgItem(IDC_PHOTO);
    //CClientDC dc(this);
    CFileDialog fileDlg(TRUE,"bmp",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"(*.bmp)|*.bmp||");
        if (fileDlg.DoModal()!=IDOK)
        {
            return;
        }
        
    CString filePath=fileDlg.GetPathName();


    CString strFileName=filePath;
    
    //成位图信息BITMAPINFO
    BITMAPINFO *bitmapinfo=NULL;
    BYTE *BmpData=NULL;
    CFile file;//读取位图信息
    //设置文件的打开方式
    if(!file.Open(strFileName,CFile::modeRead|CFile::typeBinary))
    {
        return;
    }
    //BITMAP文件头结构体
    BITMAPFILEHEADER BitmapHead;
    //读取位图文件头
    if(file.Read(&BitmapHead,sizeof(BITMAPFILEHEADER))!=sizeof(BITMAPFILEHEADER))
    {
        MessageBox("读取文件头失败!");
        return;
    }
    if(BitmapHead.bfType!=0x4d42)
    {
        MessageBox("对不起,您读取的不是位图文件!");
        return;
    }
    //位图信息
    BITMAPINFOHEADER BitmapInfo;
    if(file.Read(&BitmapInfo,sizeof(BITMAPINFOHEADER))!=sizeof(BITMAPINFOHEADER))
    {
        MessageBox("读取位图信息失败!");
        return;
    }
    if(BitmapInfo.biBitCount!=24)
    {
        MessageBox("对不起,当前程序只支持24位位图信息!");
        return;
    }
    bitmapinfo=(BITMAPINFO*)new char[sizeof(BITMAPINFOHEADER)];
    if(!bitmapinfo)
    {
        MessageBox("内存分配失败!");
        return;
    }
    /*把BMP位图信息头中的数据读取到位图信息结构中去.*/
    memcpy(bitmapinfo,&BitmapInfo,sizeof(BITMAPINFOHEADER));
    /*用来得到位图文件的大小*/
    DWORD dataByte=BitmapHead.bfSize-BitmapHead.bfOffBits;
    BmpData=(BYTE*)new char[dataByte];
    if(!BmpData)
    {
        MessageBox("内存分配失败!");
        delete bitmapinfo;
        delete BmpData;
        return;
    }
    if(file.Read(BmpData,dataByte)!=dataByte)
    {
        MessageBox("读取位图数据失败!");
        return;
    }
    file.Close();
    CClientDC *pDC=new CClientDC(this);
    pDC->SetStretchBltMode(COLORONCOLOR);
StretchDIBits(pDC->GetSafeHdc(),200,0,BitmapInfo.biWidth,BitmapInfo.biHeight, 0,0,BitmapInfo.biWidth,BitmapInfo.biHeight,BmpData,bitmapinfo,DIB_RGB_COLORS,SRCCOPY);

}

///

void CTestDlg::OnButton1() //将通过文件读出来的位图信息存储到数据库中
{
    // TODO: Add your control notification handler code here
    char *pBuffer=m_pbufferBMP;
    VARIANT varPic;
    SAFEARRAY *pArray;
    SAFEARRAYBOUND rgsabound[1];
    if (pBuffer)
    {
        rgsabound[0].lLbound=0;
        rgsabound[0].cElements=size;
        pArray=SafeArrayCreate(VT_UI1,1,rgsabound);
        char *byte;

        SafeArrayAccessData(pArray,(void**)&byte);
        for (long index=0;index<=size;++index)
        {
            byte=m_pbufferBMP;
        }
        SafeArrayUnaccessData(pArray);
        varPic.vt=VT_ARRAY | VT_UI1;
        varPic.parray=pArray;

    }

    try
    {
     m_pRecordset->AddNew();
     m_pRecordset->PutCollect("id",_variant_t("1001"));
     m_pRecordset->GetFields()->GetItem("photo")->AppendChunk(varPic);
     MessageBox("add ok");
      
    }
    catch (_com_error e)
    {

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值