• VC保存和显示数据库图像(BMP)


    源代码:下载

    简述关键代码如下:

    1、保存图片数据到数据库

    //BMP图片保存到数据库
        try
        {
            _RecordsetPtr    pRecordset;
            pRecordset.CreateInstance(__uuidof(Recordset));
            pRecordset->Open("SELECT * FROM bmp",_variant_t((IDispatch*)pConnection),adOpenStatic,adLockOptimistic,adCmdText);
            pRecordset->AddNew();
            pRecordset->Fields->Item["bmpid"]->Value = (_variant_t)m_BMPId;        //bmpid
            VARIANT pvList;
            SetPictureToVariant(pvList,(unsigned char *)m_pBMPBuffer);
            pRecordset->Fields->Item["bmpimage"]->AppendChunk(pvList);            //BMP图像文件
            VariantClear(&pvList);
        
            pRecordset->Update();
            pRecordset->Close();
            AfxMessageBox("BMP图像保存成功!");
        }
        catch(...)
        {
            AfxMessageBox("数据库读取失败");
            return;
        }
    其中SetPictureToVariant如下:
        void CBMPinDBDlg::SetPictureToVariant(VARIANT &pvList, unsigned char *sPicture)
        {
            SAFEARRAYBOUND saBound[1];
            saBound[0].cElements = m_nFileLen;
            saBound[0].lLbound = 0;
            SAFEARRAY *pSA = SafeArrayCreate(VT_UI1, 1, saBound);    
            for (long l = 0; l < (long)m_nFileLen; l ++)
            {
                SafeArrayPutElement( pSA, &l, (void*)&sPicture[l]);        
            }
            VariantClear(&pvList);
            pvList.vt = VT_UI1 | VT_ARRAY;
            pvList.parray = pSA;
        }

    2、从数据库读取图像文件并且显示在界面

        //从数据库里取BMP图像文件
        try
        {
            _RecordsetPtr    pRecordset;
            char sSql[129];
            sprintf(sSql,"SELECT *FROM bmp WHERE bmpid='%s'",m_BMPId);
            pRecordset.CreateInstance(__uuidof(Recordset));
            pRecordset->Open(sSql,_variant_t((IDispatch*)pConnection),adOpenStatic,adLockOptimistic,adCmdText);
            if (pRecordset->adoEOF)
            {
                CString str;
                str.Format("没有BMPid为: %s 的BMP图像!",m_BMPId );
                AfxMessageBox(str);
                DestroyPhoto();
                Invalidate();
                m_BMPId = "";
                UpdateData(false);
                m_EidtBMPId.SetFocus();
                return;
            }
            _variant_t pvList ;        
            long lDataSize = pRecordset->GetFields()->GetItem("bmpimage")->ActualSize;
            m_nFileLen = (DWORD)lDataSize;
            if(lDataSize > 0)
            {
                _variant_t            varBLOB;
                varBLOB = pRecordset->GetFields()->GetItem("bmpimage")->GetChunk(lDataSize);
                //把二进制格式的图片转为图片格式
                if(varBLOB.vt == (VT_ARRAY | VT_UI1))
                {
                    if(m_pBMPBuffer = new char[lDataSize+1])        
                    {    
                        char *pBuf = NULL;
                        SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
                        memcpy(m_pBMPBuffer,pBuf,lDataSize);                
                        SafeArrayUnaccessData (varBLOB.parray);
                        m_nFileLen = lDataSize;
                        m_hBitmap = BufferToHBITMAP();
                        Invalidate();//在界面显示                
                    }
                }
            }
            
        }
        catch(...)
        {
            AfxMessageBox("数据库读取失败");
            return;
        }

    上次写了两篇关于在VC界面显示图片(BMP、JPG)的文章,但是并没有涉及到数据库,所以这次补写了这两篇有关数据库的文章,这两篇文章用的是access的数据库,其它的数据库操作道理是一样的。

    具体的程序请参考附带的例子,例子里面有详细的注释。

  • 相关阅读:
    java poi 操作
    java map 根据 map的value值进行排序
    Windows navcat 连接虚拟机mysql
    如何阻止Windows广告窗口弹出
    python gitlab 学习笔记
    Java的家庭记账本程序(D)
    《程序员修炼之道:从小工到专家》的阅读笔记(二)
    Java的家庭记账本程序(C)
    Java的家庭记账本程序(B)
    Java的家庭记账本程序(A)
  • 原文地址:https://www.cnblogs.com/joinclear/p/1881241.html
Copyright © 2020-2023  润新知