新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 关于VC++的图像数据访问的研究

关于VC++的图像数据访问的研究

作者:时间:2016-12-16来源:网络收藏

  3.4 图像数据的读取
  图像数据的读取过程可以分为以下三歩:
  (1) 获得picture字段中图像文件的实际长度。
  (2) 调用getchunk函数,返回变体对象。
  (3) 获得数组数据指针,把数据写入打开的文件中。
  具体实现代码如下:
  long nsize=m_precordset-》getfields()-》getitem
  (“picture ”)-》actualsize;//获得图像文件的长度
  if(nsize1 》 0)
  { varblob=m_precordset-》getfields()-》getitem
  (“picture ”)-》getchunk(nsize);
  //获得varblob的值
  if(varblob.vt == (vt_array | vt_ui1))
  {char *pbuf = null;
  lpvoid pbuf2 = null;
  safearrayaccessdata(varblob.parray,
  (void **)&pbuf);//获得数组数据指针
  hglobal=globalalloc(gmem_moveable,
  nsize);
  pbuf2 = globallock(hglobal);
  memcpy(pbuf2,pbuf,nsize1);
  //复制数据到缓冲区
  ::globalunlock(hglobal);
  safearrayunaccessdata (varblob.parray);
  hr=::createstreamonhglobal( hglobal,
  true, &pstream );
  hr=::oleloadpicture( pstream, nsize1, true, iid_ipicture, (
  lpvoid * )&ppicture );
  ppicture-》render(pdc-》m_hdc,0,0,rect.width(),rect.height(),
  0,nheight,nwidth,-nheight,null);
  //将图像数据显示在用户界面
  }
  }
4 应用mfc odbc访问图像数据
  4.1 mfc odbc的介绍
  odbc(open database connect
  -ivity)是微软公司开放服务结构中有关数据库的一个组成部分。mfc的odbc类对较复杂的odbc
  api进行了封装,提供了简化的调用接口,方便了数据库应用程序的开发[2]。
  mfc
  odbc类主要包括cdatabase类、crecordset类和cfieldexchange类。cdatabase类的主要功能是建立与数据库的连接;crecordset类针对数据源中记录集,它负责对记录的操作;cfieldexchange类负责crecordset与数据源的数据交换。
  4.2 配置odbc数据源
  用odbc管理器定义了一个数据源,管理器根据数据源所在的位置,数据库类型及odbc驱动器等信息,建立起odbc与具体数据库之间的联系。在windows
  xp的系统中,配置odbc数据源的过程为:控制面板—性能和维护—管理工具—数据源(odbc)。
  4.3 odbc连接数据库
  创建cdatabase对象并连接数据库:
  cdatabase m_db;//定义的数据库全局变量
  cbitmap bitmap;
  //定义的图像类全局变量,存储图像数据
  m_db.open(null, false, false, “odbc;driver={microsoft access
  driver (*.mdb)};
  dbq= picture.mdb”);
  4.4 图像数据的存储
  首先做一些变量的定义:
  m_ picture为picture字段对应的长二进制成员变量;
  m_hdata用来存放picture字段的数据;
  m_dwdatalength为picture字段的实际长度。
  图像数据的存储过程可以分为以下三步:
  (1) 打开图像数据,获得数据长度;
  (2) 申请缓冲区,把文件读入此缓冲区;
  (3) 通过调用update()刷新数据库记录。
  具体实现代码如下:
  static char based_code szfilter[]=“bitmap files
  (*.bmp)|*.bmp||”;
  cdbimages dbimages(m_db);
  cfiledialog fd(true,null,null,0,szfilter,this);
  if (idok != fd.domodal()) return;
  dbimages.open();
  dbimages.addnew();
  cfile fileimage;
  cfilestatus filestatus;
  fileimage.open(fd.getpathname(), cfile::moderead);
  fileimage.getstatus(filestatus);
  //获得打开图像文件的状态
  dbimages.m_ picture.m_dwdatal -ength =
  filestatus.m_size;
  hglobal hglobal=globalalloc(gptr,filestatus.m_size);
  //分配内存
  dbimages.m_ picture.m_hdata = globallock(hglobal);
  //锁定内存
  fileimage.readhuge(dbimages.m_
  picture.m_hdata,filestatus.m_size);
  //向缓冲区读取图像数据
  dbimages.setfielddirty(&dbimages.m_ picture);
  //修改标志数据库
  dbimages.setfieldnull(&dbim -ages.m_ picture,false);
  dbimages.update();
  //刷新数据库的记录
  globalunlock(hglobal);
  dbimages.close();
  4.5 图像数据的读取
  图像数据的读取过程可以分为以下三步:
  (1) 定义临时文件。
  (2) 向临时文件中存放从数据库中读取到的图像数据。
  (3) 取出图像数据,获得图像数据的宽度和高度。
  具体实现代码如下:
  cdbimages dbimages(m_db);
  cstring strfilename ;
  i=1;
  strfilename.format(“%s”,i)
  dbimages.open();
  if (dbimages.iseof())
  afxmessagebox(“unable to get image from picture”);
  else{char tmppath[_max_path 1];
  gettemppath(_max_path,tmppath);
  strfilename.insert(0,tmppath);
  cfile outfile(strfilename,cfile::modecreate
  |cfile::modewrite);
  lpstr buffer=(lpstr)globallock(dbimages.m_ picture.m_hdata);
  outfile.writehuge(buffer,dbima -ges.m_
  picture.m_dwdatalength);
  globalunlock(dbimages.m_ picture.m_hdata);
  outfile.close();
  hbitmap hbm=(hbitmap)::loa -dimage(null,
  strfilename,image_bitmap, 0, 0, lr_loadfromfile);
  if (bitmap.attach(hbm)) { bitmap bm;
  bitmap.getbitmap(&bm); //获得图像的尺寸
  bitmap.setbitmapdimension(bm.bmwidth,bm.bmheight);//获得图像的宽度和高度
  }
5 结束语
  笔者介绍了使用ado技术和mfc
  odbc在access中存储和读取图像数据的方法以及部分程序代码。这两种访问方法在vc++
  7.0的环境下进行调试结果显示,使用ado来访问数据库中的图像数据更加的方便,更加的高效,使用mfc
  odbc方法访问大对象数据的速度相对较慢。在开发扩展时会发现mfc
  odbc不能用于其他的非关系数据库,使用的范围相对较窄。这两种方法还可以应用于其他二进制大对象数据的访问。

上一页 1 2 下一页

评论


相关推荐

技术专区

关闭