<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 關(guān)于VC++的圖像數據訪(fǎng)問(wèn)的研究

關(guān)于VC++的圖像數據訪(fǎng)問(wèn)的研究

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

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

  圖1 圖像數據訪(fǎng)問(wèn)原理圖

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

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

評論


相關(guān)推薦

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

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>