中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Visual C++ > 综合文章
VC++6.0将数据文件图像化
作者:未知 时间:2005-08-07 20:56 出处:编程爱好者网站 责编:chinaitpower
              摘要:VC++6.0将数据文件图像化
中国科学院光电技术研究所 亓 波

  不同的图像采集卡所存成的数据文件的格式是不同的,有的完全是数据的集合(如存成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);
}

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

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有