WEB开发网      婵犵數濞€濞佳囧磹婵犳艾鐤炬い鎰堕檮閸嬬喐銇勯弽銊с€掗梻鍕閺岋箑螣娓氼垱笑闂佽姘﹂褔婀佸┑鐘诧工妤犲憡绂嶉崜褏纾奸弶鍫涘妼缁楁岸鏌熷畡鐗堝殗闁诡喒鏅犲畷褰掝敃閵堝棙顔忔繝鐢靛仦閸ㄥ爼骞愰幘顔肩;闁规崘绉ぐ鎺撳亹闁绘垶锕╁Λ鍕⒑閹肩偛濡奸悗娑掓櫇缁顓兼径妯绘櫇闂佹寧绻傞弻濠囨晝閸屾稓鍘甸柣搴㈢⊕閿氶柣蹇ョ稻缁绘繃绻濋崘銊т紝闂佽鍨伴崯鏉戠暦閻旂⒈鏁傞柛鈾€鏅欑槐妯衡攽閻愬樊鍤熷┑顔藉劤铻為柛鏇ㄥ墯閸欏繘鏌嶉崫鍕櫣缂佲偓婢跺绠鹃柟瀛樼箘閿涘秵顨ラ悙顏勭伈闁诡喖缍婂畷鎯邦槻婵℃彃顭烽弻娑㈠Ω閵夈儺鍔夌紓浣稿€哥粔褰掑极閹剧粯鏅搁柨鐕傛嫹 ---闂傚倷鐒︾€笛兠洪埡鍛闁跨噦鎷�
开发学院软件开发VC VC++6.0将数据文件图像化 阅读

VC++6.0将数据文件图像化

 2008-11-13 19:30:25 来源:WEB开发网 闂傚倷绶氬ḿ褍螞閹绢喖绠柨鐕傛嫹闂傚倷绀侀幉锟犲垂閻㈠灚宕查柟鎵閸庡秵銇勯幒鎴濃偓鐢稿磻閹炬枼妲堟繛鍡楃С濞岊亞绱撻崒姘扁枌闁瑰嚖鎷�婵犵數濮幏鍐川椤撴繄鎹曢梻渚€娼уú銈吤洪妸鈺佺劦妞ゆ帊鑳堕埊鏇㈡煏閸モ晛浠х紒杈╁仱閺佹捇鏁撻敓锟�闂傚倷绶氬ḿ褍螞閹绢喖绠柨鐕傛嫹  闂傚倷鑳舵灙缂佺粯顨呴埢宥夊即閵忕姵鐎梺缁樺姇閻忔氨鈧凹鍓熷娲垂椤曞懎鍓伴梺閫炲苯澧紒澶婄秺瀵濡歌閸嬫捇妫冨☉娆忔殘闂佷紮缍€娴滎剟鍩€椤掑倹鏆柛瀣躬瀹曚即寮借閺嗭箓鏌ㄩ悤鍌涘
核心提示:不同的图像采集卡所存成的数据文件的格式是不同的,有的完全是数据的集合(如存成DAT 文件),VC++6.0将数据文件图像化,而有的还要在数据前面加一个文件头,下面就以DAT文件为例说明如何再现图像,buf=newUINT[width*height*3];for(int i=0;i<width*height;i++

不同的图像采集卡所存成的数据文件的格式是不同的,有的完全是数据的集合(如存成DAT 文件),而有的还要在数据前面加一个文件头。下面就以DAT文件为例说明如何再现图像。至于带文件头的数据文件,只要参考图像采集卡的说明书,把单纯的数据从文件中读出来,问题也就迎刃而解了。

1.将数据文件中的数据读到一指针中。

设采集图像的大小为width*height 像素,用8阶灰度表示。

  #include “iostream.h"
  #include “fstream.h"
  double *filetobuf=new UINT[width*height];
  fstream infile;
  infile.open(filename,ios::in|ios::binary);
  for(int i=0;i< width*height;i++)
  {
    infile.read((char *) (filetobuf+i),sizeof(UINT));
  }

这样就把文件中的数据读到了filetobuf指针中。

2.利用Windows的API函数 StretchDIBits()显示图像。

StretchDIBits函数将设备无关位图从原矩形拷贝到目的矩形,如果拷贝位图与目的矩形大小不适应,则相应地对位图进行扩展或者缩小操作。如果函数调用成功,则返回已经拷贝的扫描行数目,否则,函数返回值为GDI_ERRPR。函数原形如下:

    int StrechDIBits(HDC hdc,int Xdest, int Ydest,int
  nDestWidth,int nDestHeight,int XSrc,int Ysrc, < brnSrcWidth,int nSrcWidth,
  CONST VOID * lpBits,CONST BITMAPINFO
  pBitsinfo,UINT iUsage,DWORD dwRop)

其中,参数hdc 指定目的设备上下文句柄;参数Xdest 与Ydest分别以逻辑单位指定目的矩形左上角的X、 Y坐标;参数XSrc与YSrc则分别以像素点为单位,指定DIB位图中源矩形原点的X、Y 坐标;参数nDestWidth、nDestHeight分别以逻辑单位指定目的矩形的宽度与高度; nSrcWidth、nSrcHeight分别以逻辑单位指定源矩形的宽度与高度;参数lpBits指向作为字节数组进行存储的DIB位图位;lpBitsinfo指向BITMAPINFO结构;iUsage指定 BITMAPINFO结构中是否存在bmiColor成员;如果存在该成员,则其中提供颜色的显示RGB 值还是索引值;dwRop指定需要执行的光栅操作,它指定如何组合目标设备的当前画刷、

源位图以及目的位图,从而产生新的图像。

因此在使用StrechDIBits前要进行BITMAPINFOHEADER 对象的定义。

  BITMAPINFOHEADER bmiHeader;
  bmiHeader.biSize =sizeof(BITMAPINFOHEADER);
  bmiHeader.biWidth = width;
  bmiHeader.biHeight = height;
  bmiHeader.biPlanes = 1;
  bmiHeader.biBitCount = 24;
  bmiHeader.biCompression = BI_RGB;
  bmiHeader.biSizeImage = 0;
  bmiHeader.biXPelsPerMeter = 0;
  bmiHeader.biYPelsPerMeter = 0;
  bmiHeader.biClrUsed = 0;
  bmiHeader.biClrImportant = 0;
  int lines = StretchDIBits(theDC->m_hDC,
  0,0,
  bmiHeader.biWidth,
  hmiHeader.biHeight,
  0,0,
  bmiHeader.biWidth,
  bmiHeader.biHeight,
  buf,
  (LPBITMAPINFO)&bmiHeader,
  DIB_RGB_COLORS,
  SRCCOPY);

buf 应为指向真彩色图像数据部分的指针,因此必须对 filetobuf加以转化,把filetobuf对应的每个像素的值分别付给buf的R、G、B部分。

  buf=new UINT[width*height*3];
  for(int i=0;i<width*height;i++)
  {
   *(buf+i*3)=*(filetobuf+i);
   *(buf+i*3+1)=*(filetobuf+i);
   *(buf+i*3+2)=*(filetobuf+i);
  }

经过以上的变换便可以轻松显示图像了,注意图像显示 完后,要释放已申请的指针。

Tags:VC 数据 文件

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接