新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 關(guān)于VC++的圖像數(shù)據(jù)訪問(wèn)的研究

        關(guān)于VC++的圖像數(shù)據(jù)訪問(wèn)的研究

        作者: 時(shí)間:2016-12-16 來(lái)源:網(wǎng)絡(luò) 收藏
        1 引言
          在許多項(xiàng)目開(kāi)發(fā)中,由于存在著大量的數(shù)據(jù)需要存儲(chǔ),通常采用數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)這些數(shù)據(jù),使得數(shù)據(jù)庫(kù)技術(shù)被越來(lái)越廣泛地應(yīng)用。在這些數(shù)據(jù)中有簡(jiǎn)單的文本文件,只需通過(guò)api的簡(jiǎn)單編程即可實(shí)現(xiàn),但也存在許多大對(duì)象數(shù)據(jù),比如圖像、音頻和視頻等,其存儲(chǔ)形式有所不同。作為大對(duì)象數(shù)據(jù)的圖像數(shù)據(jù),一般以blob(二進(jìn)制大對(duì)象,binary large object)形式存儲(chǔ),例如access數(shù)據(jù)庫(kù)中ole對(duì)象數(shù)據(jù)類(lèi)型、sql server數(shù)據(jù)庫(kù)中的image數(shù)據(jù)類(lèi)型等。在vc++ 7.0的環(huán)境下,為了高效快捷的訪問(wèn)圖像數(shù)據(jù),需要采用合適的數(shù)據(jù)庫(kù)訪問(wèn)技術(shù)。
          在vc++中標(biāo)準(zhǔn)的訪問(wèn)數(shù)據(jù)庫(kù)技術(shù)有很多種,根據(jù)開(kāi)發(fā)的項(xiàng)目,筆者采用了數(shù)據(jù)庫(kù)技術(shù)中最常見(jiàn)有效的兩種技術(shù)ado技術(shù)和mfc odbc在access數(shù)據(jù)庫(kù)中訪問(wèn)圖像數(shù)據(jù)。
        2 圖像數(shù)據(jù)訪問(wèn)原理
          雖然圖像數(shù)據(jù)的格式有多種,例如bmp、jpg和gif等格式,但都可以看成是二進(jìn)制流,即blob類(lèi)型。blob類(lèi)型數(shù)據(jù)需要占用較大的硬盤(pán)空間和內(nèi)存,對(duì)存儲(chǔ)效率和查詢(xún)速度都有很大的影響。
          圖像數(shù)據(jù)的訪問(wèn)分存儲(chǔ)和讀取兩個(gè)過(guò)程。在存儲(chǔ)過(guò)程中,由于存放圖像數(shù)據(jù)的字段是可變長(zhǎng)度(長(zhǎng)度一般為0~2g)的blob類(lèi)型,無(wú)法直接存儲(chǔ),必須首先將存儲(chǔ)在文件中的圖像數(shù)據(jù)以二進(jìn)制流的形式讀到緩沖區(qū)中,然后再將緩沖區(qū)中的圖像數(shù)據(jù)添加到access數(shù)據(jù)庫(kù)中的ole對(duì)象中。在讀取過(guò)程中,將存放在access數(shù)據(jù)庫(kù)中的圖像數(shù)據(jù)讀到緩沖區(qū)中,然后在顯示在用戶(hù)界面上。圖像數(shù)據(jù)的訪問(wèn)原理如圖1所示。

        本文引用地址:http://www.104case.com/article/201612/330994.htm

          圖1 圖像數(shù)據(jù)訪問(wèn)原理圖

        3 應(yīng)用ado訪問(wèn)圖像數(shù)據(jù)
          3.1 ado的介紹
          ado(activex data objects)是microsoft數(shù)據(jù)庫(kù)應(yīng)用程序開(kāi)發(fā)的接口,是建立在ole db技術(shù)之上的高層數(shù)據(jù)庫(kù)訪技術(shù),簡(jiǎn)化了編程,且有利于程序的可移植性及可擴(kuò)充性。
          ado包括connection對(duì)象、command對(duì)象、parameter對(duì)象、recordset對(duì)象、field對(duì)象、error對(duì)象、property對(duì)象以及相應(yīng)的集合對(duì)象,這些對(duì)象被封裝在_connection -ptr接口、_commndptr接口和_recordsetptr接口這三個(gè)基本接口中。
          3.2 ado連接數(shù)據(jù)庫(kù)
          (1) 導(dǎo)入ado庫(kù)
          使用ado前需要在stdafx.h頭文件中導(dǎo)入該庫(kù),只需利用import指令將此動(dòng)態(tài)鏈接庫(kù)導(dǎo)入,具體代碼如下[1]:
          #import“c:program filescommon files
          systemadomsado15.dll”o_namespaceename(“eof”,
          “adoeof”)
          (2) 初始化com庫(kù)
          ado本身是一個(gè)com組件,在使用時(shí)需要初始化com庫(kù),需要調(diào)用coinitialize函數(shù)來(lái)實(shí)現(xiàn)。
          :: coinitialize(null);
          (3) 創(chuàng)建connection對(duì)象并連接數(shù)據(jù)庫(kù)
          創(chuàng)建connection對(duì)象:
          _connectionptr m_pconnection;
          m_pconnection.createinstanc -e(“adodb.connection”);
          連接數(shù)據(jù)庫(kù):
          _pconnection-》open(“provide -r=microsoft.jet.oledb.4.0;data
          source = picture.mdb”, “”,“”, admodeunknown);
          (4) 執(zhí)行操作
          m_precordset.createinstance(“adodb.recordset”);
          m_precordset-》open
          ((_variant_t)strsql,_variant_t((idispatch*)
          theapp.m_pconnection,true),adopendynamic,adlockoptimistic,adcmdtext);
          3.3 圖像數(shù)據(jù)的存儲(chǔ)
          對(duì)于一般數(shù)據(jù),可以通過(guò)recordset對(duì)象的getcollect()和putcollect()函數(shù)來(lái)對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ)和讀取,而對(duì)于圖像數(shù)據(jù),就需要使用field對(duì)象中的appendchunk函數(shù)來(lái)進(jìn)行存儲(chǔ)和getchunk函數(shù)來(lái)進(jìn)行讀取。圖像數(shù)據(jù)的存儲(chǔ)過(guò)程可以分為以下三步:
          (1) 打開(kāi)圖像數(shù)據(jù),獲得數(shù)據(jù)長(zhǎng)度;申請(qǐng)緩沖區(qū),把文件讀入此緩沖區(qū)。
          (2) 構(gòu)造一個(gè)一維數(shù)組,把緩沖區(qū)中的數(shù)據(jù)拷貝到數(shù)組中,然后構(gòu)造一個(gè)變體對(duì)象,用數(shù)組來(lái)對(duì)此對(duì)象賦值。
          (3) 調(diào)用appendchunk函數(shù),把數(shù)據(jù)存入recordset對(duì)象的本地緩沖區(qū)。
          具體實(shí)現(xiàn)代碼如下:
          if(m_pic.m_ipicture != null) m_pic.freepicturedata();
          if(f.open(m_strphotopath, cfile::moderead |
          cfile::typebinary, &e)) //打開(kāi)了一個(gè)圖像文件
          {nsize = f.getlength();//先得到圖像數(shù)據(jù)長(zhǎng)度
          byte * pbuffer = new byte [nsize];
          //根據(jù)數(shù)據(jù)的長(zhǎng)度申請(qǐng)緩沖區(qū)
          if (f.read(pbuffer, nsize) 》 0 )
          //把圖像數(shù)據(jù)讀到緩沖區(qū)
          {byte *pbuf = pbuffer;
          //把pbuffer里的jpg數(shù)據(jù)放到庫(kù)中
          variant varblob;
          safearray *psa;
          safearraybound rgsabound[1];
          //創(chuàng)建safearray對(duì)象
          if(pbuf)
          {rgsabound[0].llbound = 0;
          rgsabound[0].celements = nsize;
          psa = safearraycreate(vt_ui1, 1, rgsabound);
          for (long i = 0; i 《 (long)nsize; i++)
          safearrayputelement (psa, &i, pbuf++);
          varblob.vt = vt_array | vt_ui1;
          varblob.parray = psa;
          m_precordset-》getfields()-》getitem(“picture”)-》appendchunk(varblob);
          m_precordset-》update();//更新數(shù)據(jù)庫(kù)
          }
          delete [] pbuffer; //釋放緩沖區(qū)
          pbuf=0;
          }
          f.close();
          }

        上一頁(yè) 1 2 下一頁(yè)

        評(píng)論


        相關(guān)推薦

        技術(shù)專(zhuān)區(qū)

        關(guān)閉
        主站蜘蛛池模板: 如东县| 苍溪县| 广灵县| 南丰县| 山丹县| 奉新县| 遂宁市| 崇礼县| 建阳市| 郑州市| 内江市| 天全县| 潞西市| 科技| 石楼县| 静海县| 肃宁县| 津南区| 永仁县| 嘉禾县| 兴国县| 大洼县| 措勤县| 新蔡县| 陈巴尔虎旗| 马尔康县| 汶上县| 买车| 诸城市| 井陉县| 郁南县| 安平县| 汨罗市| 屯留县| 枞阳县| 城口县| 张掖市| 甘德县| 昌黎县| 乐亭县| 馆陶县|