在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

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

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

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

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

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

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

            上一頁 1 2 下一頁

            評論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉