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

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

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
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 要实现这个功能,你需要掌握以下几个步骤: 1. 创建一个MFC工程,并添加Opencv库。 2. 在MFC添加一个Picture Control控件,用于显示图像。 3. 编写代码读取图像文件,并将其转换为Opencv的Mat类型。 4. 调用Opencv库的函数对图像进行处理和识别。 5. 将处理后的图像转换为位图,然后将其显示在Picture Control控件上。 下面是一个简单的示例代码,帮助你了解如何实现这个功能: ``` // 首先包含必要的头文件 #include <opencv2/opencv.hpp> #include <atlimage.h> // 定义一个MFCPicture Control控件 CStatic m_pictureCtrl; // 定义一个Opencv的Mat类型变量 cv::Mat m_image; // 读取图像文件,将其转换为Mat类型 m_image = cv::imread("test.jpg"); // 在Mat类型变量上进行图像处理和识别 // ... // 将Mat类型变量转换为位图 CImage image; image.Create(m_image.cols, m_image.rows, 24); memcpy(image.GetBits(), (uchar*)m_image.data, m_image.cols * m_image.rows * 3); // 将位图显示在Picture Control控件上 m_pictureCtrl.SetBitmap(image.Detach()); ``` 需要注意的是,Opencv的Mat类型和MFC位图类型并不兼容,因此需要进行类型转换。上面的示例代码,我们使用了CImage类来创建位图,并将Mat类型变量的数据拷贝到位图。最后,使用SetBitmap函数将位图显示在Picture Control控件上。 ### 回答2: 要利用MFC和OpenCV开发一个图像识别软件,并将结果显示在MFCpictrue control控件上,可以按照以下步骤进行: 1. 首先,创建一个MFC应用程序。在创建对话框时,添加一个Picture Control控件作为图像显示区域。 2. 引入OpenCV库。可以在项目属性的“附加包含目录”添加OpenCV库的路径,并在“链接器”->“输入”->“附加依赖项”添加OpenCV库的名称。 3. 在对话框类的头文件添加包含OpenCV头文件的语句,如#include <opencv2/opencv.hpp>。 4. 在OnInitDialog()函数,初始化Pictrue Control控件,并加载图像。可以使用OpenCV的imread()函数读取图像文件,并使用OpenCV的imshow()函数将图像显示到控件上。 5. 在图像识别函数,使用OpenCV的相关函数进行图像处理和识别。例如,使用OpenCV的cvtColor()函数将图像转换为灰度图像,然后使用OpenCV提供的算法进行目标检测。 6. 将图像识别的结果显示到Pictrue Control控件上。可以使用OpenCV的相关函数将结果图像绘制到一个Mat对象上,然后使用OpenCV的imshow()函数将该图像显示到控件上。 7. 在对话框类添加一个按钮的处理函数,通过点击按钮触发图像识别的功能。在该函数,调用图像识别函数,并将结果显示到Pictrue Control控件上。 8. 最后,可以对图像识别软件进行调试和优化,并添加其他功能,如保存图像、图像处理等。 通过以上步骤,就可以利用MFC和OpenCV开发一个图像识别软件,并将结果显示到MFCPictrue Control控件上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值