Visual C++中实现对图像数据的读取显示

合集下载

VC++图形图像处理源代码

VC++图形图像处理源代码

delete pData; pData=NULL;
if(m_pBMI!=NULL) delete m_pBMI; m_pBMI=NULL; if(pfi!=NULL)
delete pfi; pfi=NULL; } CAvi::CAviCreate(CString &string)//读文件初始化该类 { HRESULT hr; pfi=new AVIFILEINFO; hr = AVIFileOpen(&pfile, // returned file pointer string, // file name OF_READ, // mode to open file with NULL); hr= AVIFileInfo(pfile, file://获取 AVI 信息,放入 pfi 中 pfi, sizeof(AVIFILEINFO) ); cx=pfi­>dwWidth;//图象宽、高 cy=pfi­>dwHeight; hr=AVIFileGetStream(//将 AVI 变成视频流 pfile, &pavi, streamtypeVIDEO, 0//LONG lParam ); m_pBMI=new BITMAPINFO;//定义 BMP 信息头 m_pBMI­>bmiHeader.biBitCount=24; m_pBMI­>bmiHeader.biClrImportant=0; m_pBMI­>bmiHeader.biClrUsed=0; m_pBMI­>bmiHeader.biCompression=BI_RGB; m_pBMI­>bmiHeader.biHeight=cy; m_pBMI­>bmiHeader.biWidth=cx; m_pBMI­>bmiHeader.biPlanes=1; m_pBMI­>bmiHeader.biSize=sizeof(BITMAPINFOHEADER); m_pBMI­>bmiHeader.biXPelsPerMeter=0; m_pBMI­>bmiHeader.biYPelsPerMeter=0; m_pBMI­>bmiHeader.biSizeImage=cx*cy*3; pData=(BYTE*)new char[cx*cy*3];//根据 AVI 中 BMP 图象的信息定义缓冲区 } BOOL CAvi::AviRead(int mFrame)//将 AVI 文件的 M 帧数据读入 PData 缓冲区 { HRESULT hr; hr= AVIStreamRead( pavi, mFrame, 1, pData, cx*cy*3,

c语言image用法 -回复

c语言image用法 -回复

c语言image用法-回复C语言image用法C语言是一种通用的编程语言,广泛应用于各种领域,包括图像处理。

在C语言中,image用法非常重要,它可以帮助我们处理图像数据,并对其进行各种操作。

本文将会详细介绍C语言中image的用法,从图像的读取到图像的处理,帮助读者了解如何使用image来处理图像数据。

首先,我们需要了解如何读取图像。

在C语言中,读取图像通常需要借助第三方库,最常用的是OpenCV库。

OpenCV是一种开源的计算机视觉库,提供了很多图像处理的功能,并支持多种图像格式。

要使用OpenCV 库,我们需要在程序中包含相应的头文件,并链接相应的库文件。

下面是一个简单的例子:c#include <opencv2/opencv.hpp>#include <iostream>using namespace cv;using namespace std;int main() {Mat image;image = imread("image.jpg", IMREAD_COLOR);if (image.empty()) {cout << "Could not open or find the image" << endl;return -1;}namedWindow("Display window", WINDOW_AUTOSIZE);imshow("Display window", image);waitKey(0);return 0;}在这个例子中,我们首先包含了OpenCV的头文件,并使用`using namespace`语句简化了对OpenCV的使用。

然后我们定义了一个`Mat`类型的变量`image`,用来存储图像数据。

通过`imread`函数读取了一张名为"image.jpg"的图像,并将图像数据保存到`image`中。

Visual C++基础入门教程-第6课:加载图片

Visual C++基础入门教程-第6课:加载图片

上一节我们学会了在窗口中显示出文字,那么漂亮的图片又是怎样显示的呢?我们通过一个例子来学习:1、图片是一种资源,因此要在资源文件中定义,每个资源都有一个标识符,在程序调用时可以使用标识符,也可以使用标识符的值,标识符在头文件中申明,VC会自动产生一个Resource.h 头文件来存放标识符申明;2、首先准备两幅图片,本文件夹中带了两个图片(Sun和Moon),在自己文件夹中新建一个名为loadPic的文件夹,把这两幅图片拷贝到这个文件夹中;3、启动VC,新建一个名为loadPic的Win32 Application工程文件,位置在自己的文件夹,新建一个相同名称的头文件和源程序文件,输入程序框架代码,在头文件中还要加入资源的申明代码为:#define IDB_SUN 101#define IDB_M OON 102在源程序文件的主函数WinMain之前加入几个全局变量的申明,代码为:HINST A NCE hInst;//保存实例句柄HWND hWnd//主窗口句柄HBIT//用于绘图HDC hdc,h//用于绘图M emDc;MA P hSun,h M oon;M ain =NULL;4、图片也要同窗口一同显示,因此加载图片的代码就应该放在W M_P A INT消息中,图片的使用跟文字输出相似,需要申请设备,然后将图片从硬盘加载到内存,还要从内存复制到应用窗口当中,所以占用了较多的资源;5、启动记事本,单击保存命令,保存在loadPic文件夹中,文件名为loadPic.rc类型为“所有文件”,即新建一个资源文件,输入代码为:#include "loadPic.h" //要用头文件中申明的标识符// 下面定义位图资源IDB_SUN BIT M AP DISC A RD A BLE "sun.bmp"//标识符,位图,内存清除,位图文件名IDB_M OON BIT MA P DISC A RD A BLE "moon.bmp"保存一下文件,然后关闭记事本,在VC窗口中单击“工程”菜单选择“添加工程”-“Files...”,选择其中的资源文件loadPic.rc单击“确定”,把资源文件加入工程当中;5、消息处理过程的代码如下(绿色双斜杠部分是注释),有的一行太长会自动折到下一行:LRESULT A PIENTRY M ainWndProc(HWND hWnd,UINT message,WP A RAM wParam,LP A R AM lParam){P A INTSTRUCT ps;//绘图所需参数结构switch(message){case W//重绘窗口//加载图片hSun =LoadBitmap(hInst,//"IDB_SUN";h//"IDB_MOON";InvalidateRect(hWnd//更新矩形区域,主窗口句柄hWndMainhdc=BeginPaint(hWndMain,&ps);//获取设备描述句柄h//获取内存设备描述表句柄,使得位图能在内存中保存下来SelectObject(h//选择位图对象,送入内存设备描述表;BitBlt(hdc,120,8,96,136,h//把位图从内存复制到窗口//图像大小:(x,y)96×136//第二幅图SelectObject(h//选择位图对象,送入内存设备描述表;BitBlt(hdc,300,80,96,136,h//把位图从内存复制到窗口//图像大小:(x,y)96×136DeleteDC(h//删除设备内存描述表中的位图EndPaint(hWnd//结束设备使用break;case W//退出DeleteObject(hSun);//删除对象释放资源DeleteObject(h M oon);PostQuit M essage(0);break;default:return(DefWindowProc(hWnd,message,wParam,lParam));}return (0);}M_CO MMA ND:caseW M_DESTROY:M ain,&ps);M emDc);M emDc,0,0,SRCCOPY);M emDc,h M oon);M emDc,0,0,SRCCOPY);M emDc,hSun);M emDc=CreateCompatibleDC(hdc);M ain,NULL,TRUE);M oon=LoadBitm ap(hInst,MA KEINTRESOURCE(102));MA KEINTRESOURCE(101));M_P A INT:保存一下文件,单击编译条上的“构建”按钮,如果出现错误就仔细检查一下,换一种方法试一下,然后单击“执行”按钮,看看生动美丽的程序窗口;本节学习了在用户区中加入图片的代码设计,如果你成功地完成了练习,请继续学习下一课内容;。

基于VisualC++和DCMTK的医学DICOM图像显示与调窗

基于VisualC++和DCMTK的医学DICOM图像显示与调窗
★基 金 项 目: 东省 医学科 研 基 金 项 目( .2 1 1 2 广 NoB 0 0 5 )
收 稿 日期 :0 1 1 1 2 1 —1 —1 修 稿 日期 :0 1 1 0 2 1 —1 -3
作 者 简 介 : 颖 波 ( 9 8 ) 男 , 东茂 名 人 , 究方 向为 医院 信 息 系统设 计 、 柯 18一 , 广 研 图像 处 理
姓名和信息版本等信息
DI OM 文件 主 要 组 成 部 分 是 数 据 集 . 据 集 南 多 C 数
D C M 医学图像的读写与显示操 作。 IO
个数据元素组成 。 含数据标签 、 表示类 型 、 长度 、 包 值 值 值 域 . 图 1 示 如 所
1 DC I OM 医学 图 像 文 件 格式
IR st n o =re / 始 窗宽 、 位 调 整 s ee Wid w t ; / u 开 窗
在 鼠 标 放 开 事 件 函 数 O L ut U n B t n p添 加 以 下 语 o 句:
I ee no =as;/ 束 窗 宽 、 位 调 整 s st dw fl / R Wi e 结 窗
息 学 领 域 的 国 际 通 用 标 准 DI OM 文 件 是 遵 照 D — C I
存档和传输系统1 系统在 医院的广泛应用 。为 了使 医疗 影像及其相关信息在计算 机问传输 .必须有 一个统一 的标准 . 目前几乎所有 欧美先进 P C 厂家都用正式 D A S
I OM 标 准 ( gtl ma iga dC mmu iain d C Dii gn n o aI nc t si Me — o n
关键 词 :医学 图像 ; M T DI OM ;窗宽 / DC K; C 窗位

用c语言读取并显示bmp图像1

用c语言读取并显示bmp图像1

如何在WIN-TC中或TC++3.0中把一张BMP格式的图片显示出来?下面的是<<C & C++编程实例>>随书光盘上的代码,我在TC2.0下编译通过.它是利用了抖动技术显示了8bit和24bit的位图(也就是256色和16M色位图),应该能满足你的需要.不过,我想问下,你老师教过抖动显示吗?#include <stdio.h>#include <dos.h>#include <stdio.h>#include <conio.h>#define NoError 0#define ErrorFileOpen 1#define ErrorFileType 2#define ErrorImageColor 3typedef struct tagBITMAPFILEHEADER{unsigned int bfType;unsigned long bfSize;unsigned int bfReserved1;unsigned int bfReserved2;unsigned long bfoffBits;}BITMAPFILEHEADER;typedef struct tagBITMAPINFOHEADER{unsigned long biSize;unsigned long biWidth;unsigned long biHeight;unsigned int biPlanes;unsigned int biBitCount;unsigned long biCompression;unsigned long biSizeImage;unsigned long biXPelsPerMeter;unsigned long biYPelsPerMeter;unsigned long biClrUsed;unsigned long biClrImportant;} BITMAPINFOHEADER;typedef struct tagRGBQUAD{unsigned char rgbBlue;unsigned char rgbGreen;unsigned char rgbRed;unsigned char rgbReserved;} RGBQUAD;unsigned char PalReg[17]= { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0}; unsigned char StandardPal[48]= {0, 0, 0, 32, 0, 0, 0,32, 0, 32,32, 0, 0, 0,32, 32, 0,32, 0,32,32, 32,32, 32, 48, 48,48, 63, 0, 0, 0,63, 0, 63,63, 0, 0, 0,63, 63, 0,63, 0,63,63, 63,63,63, };unsigned char LightnessMatrix [16][16]= {{ 0,235,59,219,15,231,55,215,2,232,56,217,12,229,52,213},{128,64,187,123,143,79,183,119,130,66,184,120,140,76,180,116},{33,192,16,251,47,207,31,247,34,194,18,248,44,204,28,244},{161,97,144,80,175,111,159,95,162,98,146,82,172,108,156,92},{8,225,48,208,5,239,63,223,10,226,50,210,6,236,60,220},{136,72,176,112,133,69,191,127,138,74,178,114,134,70,188,124},{41,200,24,240,36,197,20,255,42,202,26,242,38,198,22,252},{169,105,152,88,164,100,148,84,170,106,154,90,166,102,150,86},{3,233,57,216,13,228,53,212,1,234,58,218,14,230,54,214},{131,67,185,121,141,77,181,117,129,65,186,122,142,78,182,118},{35,195,19,249,45,205,29,245,32,193,17,250,46,206,30,246},{163,99,147,83,173,109,157,93,160,96,145,81,174,110,158,94},{11,227,51,211,7,237,61,221,9,224,49,209,4,238,62,222},{139,75,179,115,135,71,189,125,137,73,177,113,132,68,190,126},{43,203,27,243,39,199,23,253,40,201,25,241,37,196,21,254},{171,107,155,91,167,103,151,87,168,104,153,89,165,101,149,85},};unsigned char ColorTable[2][2][2]= {{{0,12},{10,14}},{{9,13},{11,15}}}; unsigned char ColorMap[256][3];int ShowBmp(char *FileName);int GetColor(unsigned char R,unsigned char G, unsigned char B,int X,int Y); void SetVideoMode(unsigned char Mode);void SetPalReg(unsigned char *palReg);void SetDacReg(unsigned char *DacReg, int Color, int Count);void PutPixel(int X, int Y, unsigned char Color);/* 主函数*/void main (int argc, char *argv[]){if(argc!=2){printf("Usage:\tSHOW Filename.BMP\n");exit(1);}ShowBmp(argv[1]);}/* 根据图像文件名,读取图像内容并利用抖动技术进行显示*/ int ShowBmp(char *FileName){FILE *Fp;BITMAPFILEHEADER FileHead;BITMAPINFOHEADER InfoHead;RGBQUAD RGB;int N, W,Y,X,C,Color;unsigned char Buffer[4096];Fp=fopen(FileName,"rb");if (Fp==NULL)return(ErrorFileOpen);fread(&FileHead,sizeof(BITMAPFILEHEADER),1,Fp);if(FileHead.bfType!='BM'){fclose(Fp);return(ErrorFileType);}fread(&InfoHead,sizeof(BITMAPINFOHEADER),1,Fp);if(InfoHead.biBitCount!=8 && InfoHead.biBitCount!=24){fclose(Fp);return(ErrorImageColor);}/* 设置显示模式和显示区域*/SetVideoMode(0x12);SetPalReg(PalReg);SetDacReg(StandardPal,0,16);/* 对两种不同色彩数的图像分别进行处理*/if(InfoHead.biBitCount==8) /* 256色*/{for (N=0;N<256;N++){fread(&RGB, sizeof(RGBQUAD),1,Fp);ColorMap[N][0]=RGB.rgbRed;ColorMap[N][1]=RGB.rgbGreen;ColorMap[N][2]=RGB.rgbBlue;}W=(InfoHead.biWidth+3)/4*4;for(Y=InfoHead.biHeight-1;Y>=480;Y--)fread(Buffer,sizeof(unsigned char),W,Fp);for(;Y>0;Y--){fread(Buffer,sizeof(unsigned char),W,Fp);for (X=0;X<InfoHead.biWidth && X<640;X++){C=Buffer[X];Color=GetColor(ColorMap[C][0],ColorMap[C][1],ColorMap[C][2],X,Y); PutPixel (X,Y,Color);}}}else /* 24bits真彩色*/{W=(InfoHead.biWidth*3+3)/4*4;for(Y=InfoHead.biHeight-1;Y>639;Y--)fread(Buffer,sizeof(unsigned char),W,Fp);for(;Y>=0;Y--){fread(Buffer,sizeof(unsigned char),W,Fp);for(X=0;X<InfoHead.biWidth && X<640;X++){C=X*3;Color=GetColor(Buffer[C+2],Buffer[C+1],Buffer[C],X,Y);PutPixel(X,Y,Color);}}}getch();fclose(Fp);SetVideoMode(0x03);return(NoError);}int GetColor(unsigned char R, unsigned char G, unsigned char B, int X, int Y) {unsigned int L=LightnessMatrix[Y & 0x0F][X & 0x0F];return(ColorTable[(unsigned int)R*256/255>L][(unsigned int)G*256/255>L][(unsigned int)B*256/255>L]); }void SetVideoMode(unsigned char Mode){_AH=0x00;_AL=Mode;geninterrupt(0x10);}void SetPalReg(unsigned char *PalReg){_ES=FP_SEG((unsigned char far*)PalReg);_DX=FP_OFF((unsigned char far*)PalReg);_AX=0x1002;geninterrupt(0x10);}void SetDacReg(unsigned char *DacReg,int Color,int Count){_ES=FP_SEG((unsigned char far*)DacReg);_DX=FP_OFF((unsigned char far*)DacReg);_AX=0x1012;_BX=Color;_CX=Count;geninterrupt(0x10);}/* 在对应位置显示像素色彩*/void PutPixel(int X, int Y, unsigned char Color){_AH=0x0C;_AL=Color;_CX=X;_DX=Y;geninterrupt(0x10);}16色位图的显示文:吴进/Luckylai对于象大家常用TC的16色图形模式编程的初学者,如果能在程序里使用图片那就会方便很多了,以前在TC256上看见吴进写的《TC的16色BMP闪电显示(66k) 》的代码,发现写的的确不错,而且绝对能在TC的initgraph()初始化的BGI模式下使用。

用Visual C++显示位图的原理与方法(同名26600)

用Visual C++显示位图的原理与方法(同名26600)

用Visual C++显示位图的原理与方法(同名26600)一、介绍在VC++环境下显示位图并不是什么新技术,但本文仍然在此“老调重弹”的原因是:(1)这一技术十分重要,它是图像编程的基础,掌握不了这些基本原理也就很难独立开发出符合实际需要的应用程序;(2)许多关于VC++编程的资料都提供了显示位图(Bitmap)的实例,但遗憾的是,由于侧重点的不同使得有关调色板、设备上下文(DC)以及图形设备接口(GDI)等与位图密切相关的知识要么是很少提到,要么就是很不全面、一代而过,或者部分内容被放到了别处,显得支离破碎。

这使得许多读者在模仿这些例子“克隆”出自己的应用程序后,仍感到有许多不解之处存在;(3)为了显示位图,Windows 及MFC提供了一些类和函数供我们利用,熟悉它们的作用对我们编程很有帮助。

二、基本概念与原理调色板:调色板的概念必须首先介绍,它在除24位真彩色显示系统的其它系统中都要用到。

尽管多媒体技术的发展令计算机所能显示的色彩越来越绚丽缤纷,但实际上,自然界无限种类的颜色目前仍无法在计算机上完全表达出来。

现在最高级的所谓24位“真彩色”的显示系统也只能显示既16,777,216种颜色,当然,这已经完全够用了,因为人眼还没有能力区分真彩色系统表现出的颜色与大自然中实际颜色的区别。

在这种系统中,每一个像素的值都用红(R)、绿(G)、蓝(B)三色,每色8位共24位来表示,“24位”显示系统的名字也由此而来,所以,其像素值就是要显示的颜色值,显然,此时只需要直接显示就行了,而不需要调色板。

但对于目前许多4位(16色)或8位(256色)显示系统来说,其像素值与颜色值并不一一对应,此时,调色板技术被派上了用场。

调色板的定义如下:它是在16色或256色显示系统中,由图像中出现最频繁的16或256种颜色组成的颜色表。

它依靠有限种颜色通过组合来实现其它颜色。

若某幅图像是使用调色板的话,那它的像素值就表示颜色在调色板查找表中的索引号,而不是颜色值。

VC界面显示图片

VC界面显示图片

VC界面显示图片(JPG JPEG GIF)2007-12-23 02:14一、引言JPEG图像压缩标准随然是一种有损图像压缩标准,但由于人眼视觉的不敏感,经压缩后的画质基本没有发生变化,很快便以较高的压缩率得到了广泛的认可。

GIF格式虽然仅支持256色但它对于颜色较少的图像有着很高的压缩率,甚至超过JPEG标准,也得到了广泛的认同。

但作为众多程序员的一个重要的开发工具--Microsoft Visual C++ 6.0的MFC库却仅对没有经过任何压缩的BMP位图文件有着良好的支持,可以读取、显示、存储甚至在内存中创建一块内存位图。

由于BMP格式的图像没有经过任何的压缩,不论是作为程序的外部文件,还是作为程序的内部资源都要占据大量的空间,尤其是后者会大大增加可执行文件的长度。

可以看出,如果能用经过压缩、具有较好的压缩率的JPEG或GIF格式的图像来取代BMP文件在VC中的应用,无疑还是很有吸引力的。

二、设计思路虽然有一些操作、处理JPEG、GIF等其他格式图像的Active X控件,但总的来说使用起来并不太方便,笔者经过实验摸索,总结出了一种借助于COM接口的OLE方法来实现上述功能的一种简便方法,现介绍如下以飨广大读者:下面我们要使用IPicture 的COM接口,有必要对该图像接口做些了解:该接口主要管理图像对象及其属性,图像对象为位图、图标和图元等提供一种与语言无关的抽象。

和标准的字体对象一样,系统也提供了对图像对象的标准实现。

其主要的接口是IPicture和IPictureDisp,后者是由IDispatch接口派生以便通过自动化对图像的属性进行访问。

图像对象也支持外部接口IPropertyNotifySink,以便用户能在图像属性发生改变时作出决定。

图像对象也支持IPersistStream接口,所以它能从一个IStream接口的实例对象保存、装载自己,而IStream 接口也支持对流对象的数据读写。

用Microsoft Visual C显示位图文件方法总结

用Microsoft Visual C显示位图文件方法总结

用Microsoft Visual C++显示位图图片的几种方法总结一,用控件框架作为装载位图的容器来显示位图用控件作为容器框架来显示位图是很多应用程序中都会遇到和用到的,因为它的方便可控制性1)、首先,我们先了解几个用到的函数:1、CWnd::GetDlgItemCWnd* GetDlgItem( int nID ) const;void CWnd::GetDlgItem( int nID, HWND* phWnd ) const;返回值:指向给定的控件或子窗口的指针。

如果没有控件具有nID给出的整数ID,则返回NULL。

返回的指针可能是临时的,不能被保存以供将来使用。

参数:nID 指定了要获取的控件或子窗口的标识符。

phWnd 指向子窗口的指针。

说明:这个函数获得对话框或其它窗口中指定控件或子窗口的指针。

返回的指针通常被强制转换为nID所标识的控件类型。

2、CWnd::GetDCCDC* GetDC( );返回值:如果调用成功,则返回CWnd客户区的设备环境;否则,返回NULL。

这个指针可能是临时的,不能被保存以供将来使用。

说明:这个函数获得一个指针,指向一个客户区的公用的、属于类的或者私有的设备环境,依赖于为CWnd指定的类风格。

对于公用的设备环境,GetDC每次获得设备环境时都给它赋予缺省值。

对于属于类的或者私有的设备环境,GetDC保持原来的属性不变。

在随后的图形设备接口(GDI)函数中可以使用设备环境以在客户区中绘图。

除非设备环境属于一个窗口类,否则在绘图之后必须调用ReleaseDC成员函数以释放设备环境。

由于在同一时刻只有五个公用设备环境可供使用,因此如果释放设备环境时失败,可能导致其它应用程序不能访问设备环境。

如果在注册窗口类的时候,在WNDCLASS的风格中指定了CS_CLASSDC,CS_OWNDC或CS_PARENTDC,则GetDC成员函数将返回属于CWnd类的设备环境。

C语言实现图像识别

C语言实现图像识别

C语言实现图像识别图像识别是计算机视觉领域的重要研究方向之一,它通过算法和模型实现计算机对图像内容的理解和分类。

C语言是一种通用的高级编程语言,具有高效性和强大的计算能力,因此在图像识别领域中也有广泛的应用。

本文将介绍C语言在图像识别方面的应用和实现。

一、图像预处理在进行图像识别之前,首先需要对图像进行预处理。

图像预处理的目的是去除图像中的噪声、调整图像的对比度和亮度等,从而更好地提取图像特征。

在C语言中,我们可以使用各种图像处理库,如OpenCV来实现图像预处理。

下面是一个简单的C语言代码示例,演示了如何使用OpenCV对图像进行预处理:```C#include <opencv2/opencv.hpp>using namespace cv;int main(){// 读取图像Mat image = imread("image.jpg", IMREAD_COLOR);// 转为灰度图像cvtColor(image, image, COLOR_BGR2GRAY);// 高斯模糊GaussianBlur(image, image, Size(5, 5), 0);// 边缘检测Canny(image, image, 50, 150);// 显示图像imshow("Processed Image", image);waitKey(0);return 0;}```二、特征提取在进行图像识别之前,还需要提取图像的特征。

特征提取是将图像转换为计算机可理解的数值形式,以便进行进一步的处理和分类。

C 语言提供了各种特征提取的方法和算法的实现,下面是一个简单的C 语言代码示例,演示了如何使用C语言进行图像特征提取:```C#include <stdio.h>int main(){// 读取图像特征数据float features[100];FILE *file = fopen("features.txt", "r");for (int i = 0; i < 100; i++) {fscanf(file, "%f", &features[i]);}fclose(file);// 进行图像分类或其他处理// ...return 0;}```三、模型训练与识别在进行图像识别之前,需要训练一个模型来对图像进行分类。

VC下显示位图的几种方法

VC下显示位图的几种方法

VC下显示位图的几种方法VC下显示位图的几种方法 VC下显示位图的几种方法总结一下关于位图的几种用法。

说到这还是开头给大家介绍一下,有关位图的知识吧,以及对于我们比较有用的几个关于位图的结构体。

一.位图结构如下:---- 一、BMP文件结构---- 1. BMP文件组成---- BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。

---- 2. BMP文件头---- BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。

---- 其结构定义如下:typedef struct tagBITMAPFILEHEADER{WORDbfType; // 位图文件的类型,必须为BMDWORD bfSize; // 位图文件的大小,以字节为单位WORDbfReserved1; // 位图文件保留字,必须为0WORDbfReserved2; // 位图文件保留字,必须为0DWORD bfOffBits; // 位图数据的起始位置,以相对于位图// 文件头的偏移量表示,以字节为单位} BITMAPFILEHEADER;---- 3. 位图信息头BMP位图信息头数据用于说明位图的尺寸等信息。

typedef struct tagBITMAPINFOHEADER{DWORD biSize; // 本结构所占用字节数LONGbiWidth; // 位图的宽度,以像素为单位LONGbiHeight; // 位图的高度,以像素为单位WORD biPlanes; // 目标设备的级别,必须为1WORD biBitCount// 每个像素所需的位数,必须是1(双色),// 4(16色),8(256色)或24(真彩色)之一DWORD biCompression; // 位图压缩类型,必须是 0(不压缩), // 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一DWORD biSizeImage; // 位图的大小,以字节为单位LONGbiXPelsPerMeter; // 位图水平分辨率,每米像素数LONGbiYPelsPerMeter; // 位图垂直分辨率,每米像素数DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数DWORD biClrImportant;// 位图显示过程中重要的颜色数} BITMAPINFOHEADER;---- 4. 颜色表颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。

VC界面显示图片(BMP)

VC界面显示图片(BMP)

VC界面显示图片(BMP)1、通过点击浏览按钮选择BMP图像文件点击浏览按钮打开文件对话框选择BMP图像文件,得到文件所在的路径目录。

关键代码如下:char szFilter[] = "BMP Files (*.bmp)|*.bmp|All Files (*.*)|*.*||"; CFileDialog dlg( TRUE,"BMP",NULL,OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT,szFilter );if(dlg.DoModal() == IDOK){CString strPathName = dlg.GetPathName();}2、加载BMP文件到内存通过得到的BMP图像文件路径目录,加载BMP图像文件到内存中。

关键代码如下:BOOL CShowBMPDlg::LoadShowBMPFile(const char *pPathname){CFile file;if( !file.Open( pPathname, CFile::modeRead) )return FALSE;DWORD m_nFileLen;m_nFileLen = file.GetLength();m_pBMPBuffer = new char[m_nFileLen + 1];if(!m_pBMPBuffer)return FALSE;if(file.ReadHuge(m_pBMPBuffer,m_nFileLen) != m_nFileLen)return FALSE;return TRUE;}3、将内存中的BMP文件内容转换到HBITMAP将内存中的BMP文件内容转换成位图句柄。

关键代码如下:HBITMAP CShowBMPDlg::BufferToHBITMAP(){HBITMAP hShowBMP;LPSTR hDIB,lpBuffer = m_pBMPBuffer;LPVOID lpDIBBits;BITMAPFILEHEADER bmfHeader;DWORD bmfHeaderLen;bmfHeaderLen = sizeof(bmfHeader);strncpy((LPSTR)&bmfHeader,(LPSTR)lpBuffer,bmfHeaderLen);if (bmfHeader.bfType != (*(WORD*)"BM")) return NULL;hDIB = lpBuffer + bmfHeaderLen;BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB ;BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;lpDIBBits=(lpBuffer)+((BITMAPFILEHEADER *)lpBuffer)->bfOffBits; CClientDC dc(this);hShowBMP =CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB _COLORS);return hShowBMP;}4、在屏幕上显示BMP图像双缓冲实现BMP位图显示在屏幕上。

VS2010中MFC利用CImage类显示图像

VS2010中MFC利用CImage类显示图像

VS2010中MFC利用CImage类显示图像我们知道,Visual C++的CBitmap类和静态图片控件的功能是比较弱的,它只能显示出在资源中的图标、位图、光标以及图元文件的内容,而不像VB中的Image控件可以显示出绝大多数的外部图像文件(BMP、GIF、JPEG等)。

因此,想要在对话框或其他窗口中显示外部图像文件则只能借助于第三方提供的控件或代码。

现在,MFC和ATL共享的新类CImage为图像处理提供了许多相应的方法,这使得Visual C++在图像方面的缺憾一去不复返了。

一、CImage类概述CImage是MFC和ATL共享的新类,它能从外部磁盘中调入一个JPEG、GIF、BMP和PNG格式的图像文件加以显示,而且这些文件格式可以相互转换。

由于CImage在不同的Windows操作系统中其某些性能是不一样的,因此在使用时要特别注意。

例如,CImage::PlgBlt和CImage::MaskBlt只能在Windows NT 4.0 更高版本中使用,但不能运行在Windows 95/98 应用程序中。

CImage::AlphaBlend和CImage::TransparentBlt也只能在Windows 2000/98或其更高版本中使用。

即使在Windows 2000运行程序还必须将stdafx.h文件中的WINVER和_WIN32_WINNT的预定义修改成0x0500才能正常使用。

二、MFC中使用CImage类显示图像在图像控件(pictureControler)上(1)环境:Visual Studio 2010(2)如何使用?在使用的类头文件中,加入头文件“#include "atlimage.h"”(3)解决:1.类试图中,通过向导为Picture控件添加变量,如果不成功,则手动添加。

参考(VS2010为Picture Control手动添加变量)2.在对应的函数里添加如下代码:CImage image; //创建图片类image.Load(rphoto); //根据图片路径加载图片CRect rect;//定义矩形类int cx = image.GetWidth();//获取图片宽度int cy = image.GetHeight();//获取图片高度GetDlgItem(IDC_PICTURE)-&gt;GetWindowRect(&amp;rect);//将窗口矩形选中到picture控件上ScreenToClient(&amp;rect);//将客户区选中到Picture控件表示的矩形区域内GetDlgItem(IDC_PICTURE)-&gt;MoveWindow(rect.left, rect.top, cx, cy, TRUE);//将窗口移动到Picture控件表示的矩形区域CWnd *pWnd=GetDlgItem(IDC_PICTURE);//获得pictrue控件窗口的句柄pWnd-&gt;GetClientRect(&amp;rect);//获得pictrue控件所在的矩形区域CDC *pDC=pWnd-&gt;GetDC();//获得pictrue控件的DCimage.Draw(pDC-&gt;m_hDC, rect); //将图片画到Picture控件表示的矩形区域18. ReleaseDC(pDC);//释放picture控件的DC CImage image; //创建图片类image.Load(rphoto); //根据图片路径加载图片CRect rect;//定义矩形类int cx = image.GetWidth();//获取图片宽度int cy = image.GetHeight();//获取图片高度GetDlgItem(IDC_PICTURE)-&gt;GetWindowRect(&amp;rect); //将窗口矩形选中到picture控件上ScreenToClient(&amp;rect);//将客户区选中到Picture控件表示的矩形区域内GetDlgItem(IDC_PICTURE)-&gt;MoveWindow(rect.left, rect.top, cx, cy, TRUE);//将窗口移动到Picture控件表示的矩形区域CWnd *pWnd=GetDlgItem(IDC_PICTURE);//获得pictrue控件窗口的句柄pWnd-&gt;GetClientRect(&amp;rect);//获得pictrue控件所在的矩形区域CDC *pDC=pWnd-&gt;GetDC();//获得pictrue控件的DC image.Draw(pDC-&gt;m_hDC, rect); //将图片画到Picture控件表示的矩形区域ReleaseDC(pDC);//释放picture 控件的DC3.编译,运行。

在 Visual C# 中直接将一个图片从数据库读到 PictureBox 控件中

在 Visual C# 中直接将一个图片从数据库读到 PictureBox 控件中

在Visual C# 中直接将一个图片从数据库读到PictureBox 控件中1.使用以下结构创建一个SQL Server 或Access 表:CREATE TABLE BLOBTest(BLOBID INT IDENTITY NOT NULL,BLOBData IMAGE NOT NULL)2. 打开Visual Studio .NET,然后新建一个Visual C# Windows 应用程序项目。

3. 从工具箱向默认的Form1 添加一个PictureBox 和两个Button 控件。

将Button1 的Text 属性设置为File to Database,并将Button2 的Text 属性设置为Database to PictureBox。

4. 在窗体的代码模块顶部插入using 语句:using System.Data.SqlClient;using System.IO;using System.Drawing.Imaging;5. 将以下数据库连接字符串的声明添加到public class Form1 :System.Windows.Forms.Form 类声明中,并根据需要调整连接字符串:String strCn = "Data Source=localhost;integrated security=sspi;initial catalog=mydata";6. 将下面的代码插入Button1 (File to Database) 的Click 事件过程中。

根据需要调整到一个可用示例图像文件的可用路径。

此代码可将图像文件从磁盘(使用一个FileStream 对象)读入Byte 数组,然后使用一个参数化的Command 对象将数据插入数据库。

try{SqlConnection cn = new SqlConnection(strCn);SqlCommand cmd = new SqlCommand("INSERT INTO BLOBTest (BLOBData) V ALUES (@BLOBData)", cn);String strBLOBFilePath = @"C:/blue hills.jpg";FileStream fsBLOBFile = new FileStream(strBLOBFilePath, FileMode.Open, FileAccess.Read);Byte[] bytBLOBData = new Byte[fsBLOBFile.Length];fsBLOBFile.Read(bytBLOBData, 0, bytBLOBData.Length);fsBLOBFile.Close();SqlParameter prm = new SqlParameter("@BLOBData", SqlDbType.VarBinary, bytBLOBData.Length, ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, bytBLOBData);cmd.Parameters.Add(prm);cn.Open();cmd.ExecuteNonQuery();cn.Close();}catch(Exception ex){MessageBox.Show(ex.Message);}7. 将下面的代码插入Button2 (Database to PictureBox) 的Click 事件过程。

c语言获取当前屏幕画面数据方法

c语言获取当前屏幕画面数据方法

方案一:使用Win32 API获取当前屏幕画面数据1. 背景介绍C语言作为一种经典的编程语言,其强大的功能和灵活的特性使得它在图像处理和屏幕画面数据获取方面有着独特的优势。

在Windows 操作系统中,可以通过Win32 API来获取当前屏幕画面数据,为后续的图像处理和分析提供了基础数据支持。

2. Win32 API简介Win32 API是Windows操作系统的核心API之一,它提供了丰富的函数和数据结构,可以用于控制窗口、处理消息、管理文件和目录等各种操作。

其中,针对屏幕画面数据获取,主要可以利用GDI(图形设备接口)和DirectX等技术来实现。

3. 获取屏幕画面数据的基本步骤在使用C语言获取当前屏幕画面数据时,需要经过以下基本步骤:- 初始化相关环境:包括初始化GDI或DirectX环境,并创建用于存储画面数据的缓冲区。

- 获取屏幕画面数据:通过调用相应的API函数,将屏幕上的图像数据读取到缓冲区中。

- 处理和分析画面数据:对获取到的画面数据进行处理和分析,可以进行图像识别、分析、处理等操作。

4. 具体实现方法在C语言中,可以使用相关的Win32 API函数来实现获取当前屏幕画面数据的功能。

可以通过以下步骤来获取屏幕画面数据:1. 初始化GDI环境,包括创建设备上下文(DC)和位图对象。

2. 调用BitBlt函数将屏幕上的图像数据复制到位图对象中。

3. 将位图对象中的像素数据读取到缓冲区中,即可获得当前屏幕的画面数据。

5. 个人观点和总结C语言作为一种强大的编程语言,在图像处理和屏幕画面数据获取方面具有一定的优势,尤其是在Windows评台下,可以充分利用Win32 API来实现相关功能。

通过对Win32 API的调用,可以较为便利地获取当前屏幕的画面数据,并为后续的图像处理和分析提供基础支持。

然而,需要注意的是,在使用Win32 API时,需要关注相关的权限和安全性问题,以确保程序的稳定性和安全性。

基于Visual C#语言的DICOM标准医学图像的显示和实现

基于Visual C#语言的DICOM标准医学图像的显示和实现
( I m a g e ) 等 多种 信息 。为 了表 达 这些 信 息 , D I C O M标
D I C O M ( D i g i t a l
a n d C o m m u n i c a t i o n O i l
M e d i c n i e , D I C O M ) [ 1 】 标准是 医学 图像存储 和传输 的 标准 , 为医学影像设备的生产厂家和用户 提供 了接
g u a g e .DI C OM i f l s e a r e d i s p l a y e d b y u s i n g C# f o r he t i f r s t t i m e .R a w h n a  ̄ e d a t a C n a b e r e a d nd a c h a n g e d t o B MP i f l e f o r ma t f o r f u t u r e u s e .T h i s t a s k c a n e b he t b a s i s f o me d i c a l i Ⅱ l a g e p r o c e s s i n g nd a s o f t w a r e d e v e l o p i n g .
维普资讯

1 2.
《 上 海 生 物 医 学 工 程 》 2 0 年 第2 5 卷 第l 塑 壅
基于 V i s u a l C } ≠ 语言的 D I C O M 标 准 医 学 图 像 的显 示 和 实 现
杨 汝 奚弘光 高建 新 丁 祖 泉
同济 大学生命科 学与技术 学院
( 上海 2 O 0 O 9 2 )
【 摘要 】 介绍 D I C O M 3 . 0医学图像文件 的格式 和 c#语言 的特 点 , 首次利用 V i s u a l c#语言对 该标 准的 图像 进行显示 和 处理 , 能够直接读取 D I c O M格式原始 图像 数据 , 并可批量转换成 B M P等格 式进行处理 , 此项 工作 可为 医学图像处理研究 及相 关 医学 图像软件开发奠定基础 。 【 关键 词l D I C O M; 医学 图像 ; 数据 集 ; 数据元 素 ; 像素

VC图像库及图像加载方法

VC图像库及图像加载方法

VC++几种图像库及图像加载方法一、使用CImage类加载用CImage类的Load函数加载图片,之后用Detach()取得HBITMAP句柄,取得图片的HBITMAP句柄后就可以像操作BMP图片一样处理JPG/JPEG/GIF/PNG CImage img;HRESULT ret=image.Load(filename);//filenam 是要加载的文件名路径HBITMAP bitmap=img.Detach()//像操作BMP图片一样处理图片CString str_Photo = theApp.m_UserPhoto ;if ((str_Photo.Right(3)==_T("bmp"))||(str_Photo.Right(3)==_T("BMP"))){CDC *pDC = m_Picture.GetDC();CRect m_Rect;m_Picture.GetClientRect(&m_Rect);CDC dc;dc.CreateCompatibleDC(pDC);//CreateCompatibleDCHBITMAP hBitmap;hBitmap = (HBITMAP)LoadImage(NULL,str_Photo,IMAGE_BITMAP,0,0,LR_DEFAULTSIZE |LR_LOADFROMFILE);CBitmap m_Bitmap;m_Bitmap.Attach(hBitmap);//loadBitmap;dc.SelectObject(&m_Bitmap);BITMAP bmp;m_Bitmap.GetBitmap(&bmp);pDC->StretchBlt(m_Rect.left,m_Rect.top,m_Rect.Width() ,m_Rect.Height(),&dc,0,0, bmp.bmWidth,bmp.bmHeight,SRCCOPY);dc.DeleteDC();}else if ((str_Photo.Right(3)==_T("jpg"))||(str_Photo.Right(3)==_T("JPG"))){IStream *m_pStream;//定义流对象IPicture *m_pPicture;//定义接口对象OLE_XSIZE_HIMETRIC m_JpgWidth; //jpg widthOLE_XSIZE_HIMETRIC m_JpgHeight;//jpg heightHGLOBAL hMem; //定义堆句柄CFile m_File;m_File.Open(str_Photo,CFile::modeReadWrite); ///读文件ULONGLONG filesize = m_File.GetLength();///get file lengthhMem = GlobalAlloc(GMEM_MOVEABLE,filesize);///alloc meomeryLPVOID pData = NULL;pData = GlobalLock(hMem); //lock the meomry areym_File.Read(pData,filesize);///read file to the meomerym_File.Close();GlobalUnlock(hMem);CreateStreamOnHGlobal(hMem,TRUE,&m_pStream);OleLoadPicture(m_pStream,filesize,TRUE,IID_IPicture,(LPVOID*)&m_pPicture);m_pPicture->get_Width(&m_JpgWidth);m_pPicture->get_Height(&m_JpgHeight);CDC *pDC = m_Picture.GetDC();CDC dc;dc.CreateCompatibleDC(pDC);CRect rect;m_Picture.GetClientRect(&rect);m_pPicture->Render(pDC->m_hDC,rect.left,rect.top,rect.Width(),rect.Height(),0,m_J pgHeight,m_JpgWidth,-m_JpgHeight,NULL);GlobalFree(hMem);DeleteDC(dc);}这是读取图片路径读取BMP或JPG图像,并显示。

C 语言图像读取

C 语言图像读取

#include "stdio.h"#include "math.h"#include "graphics.h"#include "string.h"#include "dos.h"#include "stdlib.h"#include "alloc.h"#include "conio.h"#include "bios.h"#include "mem.h"#include "dir.h"#include "ctype.h"#define LEFT 75#define RIGHT 77#define UP 72#define DOWN 80#define ESC 0X001b#define ENTER 0X1C0d#define Home 71#define End 79#define Alt_x 45#define Ctrl_LEFT 115#define Ctrl_RIGHT 116#define Ctrl_Home 119#define Ctrl_End 117#define PgUp 73#define PgDn 81typedef struct //定义结构体{int topx,topy;int bottomx,bottomy;char name[20];char color;}BUTTON;union KEY //定义共用体{int k;char c[2];}key1; struct BMP_Head{char ID[2]; /*总是BM*/unsigned long FileLength; /*文件大小,以字节为单位*/int Reserved1; /*必须为0*/int Reserved2; /*必须为0*/unsigned long ImagePosition; /*图像数据的起始位置*/unsigned long HeadLength; /*文件头的大小*/unsigned long ImageWidth; /*图像宽度*/unsigned long ImageHeight; /*图像高度*/int BitPlane; /*必须为1*/int ColorBit; /*每个像素的位数(1.4.8或24)*/unsigned long CompressMethod; /*图像所用的压缩类型*/unsigned long ImageLength; /*图像字节数的多少*/unsigned long HorizontalDefinition; /*图像水平分辨率*/unsigned long VerticalDefinition; /*图像垂直分辨率*/unsigned long UsedColorNumber; /*图像实际使用的颜色数*/unsigned long ImportantColorNumber; /*重要的颜色数*/}bmp_head;struct BMP_Palette // 定义调色板大小{unsigned char palette[256][4];}bmp_palette;unsigned char *i_img;unsigned char *o_img;unsigned char *shadow_buf;unsigned int palette_size;unsigned long img_row,img_col,line_size; unsigned long w=256l,D=256l;int INITmode;void SetScrMode(int); //设置显示模式int GetScrMode(void); //获取显示模式void InitGraphics(void); // 初始化图形系统void ReadBMPHeadInfo(char*); //读取BMP 图像文件头void DisplayImgHeadInfo(char*);void DisplayRoamImage(unsigned char *,long); //显示内存缓冲区中图像void SaveBufToFile(unsigned char *); //将内存缓冲区中的图像存入磁盘void Display8BitBMPImage(char*); //从磁盘中读取图像并放入内存缓冲上区中,然后调用DisplayRoamImage()显示void InitGraphics(void){int g_driver,g_mode,g_error;closegraph();g_driver=DETECT;///让系统自动检测图形适配器的最高分///辨模式的,并装入相应的图形驱动程序g_error=0;initgraph(&g_driver,&g_mode,"");g_error=graphresult();if(g_error<0);{outtextxy(30,120,"initgraph error!");exit(1);restorecrtmode();} }void ReadBMPHeadInfo(char *filename) {FILE *fp;fp=fopen("c:\\lena.bmp":,"rb");if(fp==NULL){printf("cannot open this file\n");exit(0);}fread(&bmp_head,sizeof(bmp_head),1,fp);if((bmp_head.ID[0]!='B')&&(bmp_head.ID[1] !='M')){printf("this file is not BMP file\n");fclose(fp);exit(0);}palette_size=bmp_head.ImagePosition-sizeof( bmp_head);fread(&bmp_palette,1,palette_size,fp);img_row=bmp_head.ImageHeight;img_col=bmp_head.ImageWidth;line_size=(bmp_head.ImageWidth*bmp_head. ColorBit+31)/32*4;fclose(fp);}void load_data(char *filename,unsigned char *in_img){FILE*fp;int i,n;unsigned char *buffer;fp=fopen("c:\\lena.bmp","rb");if(fp==NULL){printf("Cannot open this file\n");exit(0);}fread(&bmp_head,sizeof(bmp_head),1,fp );if((bmp_head.ID[0]!='B')&&(bmp_head. ID[1]!='M')){printf("this file is not BMP file\n");fclose(fp);exit(0);}palette_size=bmp_head.ImagePosition-sizeof( bmp_head);fread(&bmp_palette,1,palette_size,fp);img_row=bmp_head.ImageHeight;img_col=bmp_head.ImageWidth;//img_size=(bmp_head.ImageWidth*bim_hea d.ColorBit+31)/32*4;line_size=(bmp_head.ImageWidth*bmp_head. ColorBit+31)/32*4 ;buffer=in_img;for(i=0;i<img_row;i++){fread((void*)buffer,line_size,1,fp);buffer+=line_size;}fclose(fp);}unsigned char *alloc_mem(unsigned long buffer_size){unsigned char *mem_ptr;if(buffer_size>farcoreleft()){printf("no enough memory");exit(0);}mem_ptr=(unsigned char *)farmalloc(buffer_size);if(mem_ptr==NULL){printf("cannot allocate memory\n");exit(0);}return(mem_ptr);}void save_data(char *filename,unsigned char *buffer){int i,n;FILE* fp;fp=fopen("c:\\lena.bmp","wb");if(fp==NULL) exit(0);fwrite(&bmp_head,sizeof(bmp_head),1,f p);n=bmp_head.ImagePosition-sizeof(bmp_ head);fwrite(&bmp_palette,n,1,fp);for(i=0;i<img_row;i++){fwrite((void*)buffer,line_size,1,fp);buffer+=line_size;}fclose(fp);}void set_grey_palette(void){int i,j;outportb(0x3c8,0x00);for(i=0;i<256;i++);for(j=2;j>=0;j--);{outportb(0x3c9,i>>2);}}void set_color_palette( unsigned char palette[][4],int length){int i,j,ch,k;outportb(0x3c8,0x00);for(i=0;i<length;i++)for(j=2;j>=0;j--){ch=palette[i][j]>>2;outportb(0x3c9,ch);}}void SetScrMode(int mode){union REGS reg;reg.h.ah=0;reg.h.al=mode;int86(0x10,&reg,&reg);}int GetScrMode(){union REGS reg;reg.h.ah=0xf;int86(0x10,&reg,&reg);return((int)reg.h.al);}void SaveBufToFile( unsigned char * result_image){int key1,key2;char save_filename[80];struct ffblk f; ///////ffblk 是一个struct,定义在dir.h 中,用于保存查找到的文件信息。

vc6对话框或控件上显示图片

vc6对话框或控件上显示图片

VC中在对话框上显示图片用图片控件,好像图片最多色彩数不超过256色,也就是8位,但是用代码在里面写的方法就可以解决这个问题了.让一个对话框显示背景通常有两种做法:使用图片控件、在WM_PAINT消息中画图。

用图片控件非常简单,但功能功能不强大,不能对图片拉申等。

在WM_PAINT中画图,相对复杂,但可以做很多特殊处理(如对图片拉申、图片取反等等)。

那么下面就对两种方法略述。

1、用图片控件在对话框中加入Picture控件,属性页中General->Type设为Bitmap, Image中选中相关联的图片资源号。

这样就编译运行,你就会发现它己经可以了。

耶,不对,图片复盖了其它控件!怎么办?哈哈,这是由于你的Picture控件是后面放上去的。

这样它会显示在最上层,所以有些控件看不到了。

有两种方法可以解决:(1)、选中所有控件Ctrl+A, 然后取消对图片控件的选择,将其它控件剪切Ctrl+X,再粘帖Ctrl+C,编译运行或Ctrl+T看看,是不是可以了?(2)、在.rc文件中找到此对话框的定义,此处以例子中的一对话框为例。

(用记事本打开.rc 文件)IDD_DLG_USE_STA TIC DIALOGEX 0, 0, 266, 201STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENUEXSTYLE WS_EX_APPWINDOWCAPTION "DlgUseStatic"FONT 9, "宋体"BEGINCONTROL 129,IDC_STATIC,"Static",SS_BITMAP,0,0,266,201PUSHBUTTON "取消",IDCANCEL,210,23,50,14DEFPUSHBUTTON "确定",IDOK,210,7,50,14LTEXT "这是个通过图片控件来实现Dialog背景的",IDC_STATIC,13,106,156,8PUSHBUTTON "方法二>>",IDC_BUTTON1,215,104,50,14END在BEGIN至END中便是各个控件的定义和先后顺序,你可以随意调整它们的顺序,这样最先的,它将会显示在最底层(即可能被其它控件覆盖)。

用VisualC++语言进行BMP图像文件的显示

用VisualC++语言进行BMP图像文件的显示

用VisualC++语言进行BMP图像文件的显示
桂志国;薄瑞峰
【期刊名称】《山西电子技术》
【年(卷),期】2000(000)001
【摘要】系统地介绍了位图文件的结构及其显示方法,并给出了实例程序。

【总页数】7页(P12-17,28)
【作者】桂志国;薄瑞峰
【作者单位】不详;不详
【正文语种】中文
【中图分类】TP391.41
【相关文献】
1.利用PL/M语言对点阵式液晶显示器进行汉字程序设计 [J], 吴新杰
2.BMP图像文件在DOS下的显示 [J], 黄永亨;郭红
3.利用BMP图像文件进行秘密储存 [J], 周瑞辉;荆继武
4.非Windows环境下BMP图像显示的C语言实现 [J], 蒋明;李葆华
5.用面向对象语言VisualC++进行界面设计的体会 [J], 李君;高式昌
因版权原因,仅展示原文概要,查看原文内容请购买。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Visual C++中实现对图像数据的读取显示
在利用VC进行数据库编程时,经常需要处理数据库中的图像数据,将该图像从数据库中读取出来并显示,图像数据与文本字段不同,它是作为OLE字段在数据库中存储,通过数据集对象的成员变量自动交换得到的图像数据,得到的数据并不能直接显示,如何处理图像数据,一直是数据库编程中的一个难点,目前关于VC进行数据库编程的资料不少,但很少涉及图像数据的操作,笔者针对一现状,结合自己开发的一个项目,解决了如何显示数据库中的图像这一问题,本文以操作ACESS数据库为例子,讲解一下自己的实现思路,希望对爱好VC编程的朋友们有所帮助,以起到抛砖引玉的作用。

为了简化问题,该数据库的表中只有一个名为Images的OLE字段,我使用DAO连接操作数据库,读取的图像数据显示在一个对话框上,至于使用ODBC、DAO还是ADO,这要根据具体情况而定,但无论使用哪一种,对图像的显示来说,实现的过程是大同小异的。

由于篇幅有限,文章中对如何实现数据库的连接不再作具体的说明,有兴趣的读者朋友可以参考VC数据库编程的资料。

实现过程中,首先定义一个CDaoRecordset的子类CimageData如下:
class CimageData:public CDaoRecordset
{
public:
CimageData(CDaoDatabase*pDatabase=NULL);
DECLARE_DYNAMIC(CimageData)
file://{{AFX_FIELD(CimageData,CDaoRecordset)
CByteArray m_Images;//声明字节数组用来存放图像数据
file://}}AFX_FIELD
//Overrides
//ClassWizard generated virtual function overrides
file://{{AFX_VIRTUAL(CimageData)
public:
virtual CString GetDefaultDBName();
virtual CString GetDefaultSQL();
virtual void DoFieldExchange(CDaoFieldExchange*pFX);
file://}}AFX_VIRTUAL
该类的实现为:
CimageData::CimageData(CDaoDatabase*pdb)
:CDaoRecordset(pdb)
{
file://{{AFX_FIELD_INIT(CimageData)
m_nFields=1;//数据库的表中仅有一个字段
file://}}AFX_FIELD_INIT
m_nDefaultType=dbOpenDynaset;//以动态集方式打开数据库
}
CString CimageData::GetDefaultDBName()
{
return_T("E:\\IMAGES.mdb");//默认的ACESS数据库在E盘,名为IMAGES
}
CString CimageData::GetDefaultSQL()
{
return_T("[Table]");//默认打开数据库中名为"Table"的表
}
void CimageData::DoFieldExchange(CDaoFieldExchange*pFX)
{
file://{{AFX_FIELD_MAP(CimageData)
pFX->SetFieldType(CDaoFieldExchange::outputColumn);
DFX_Binary(pFX,_T("[Images]"),m_Images);//以二进制方式在Images字段和m_Images变量间交换数据file://}}AFX_FIELD_MAP
}
有了该类,就可以定义相应的对象来与数据库中的图像字段交换数据,下面定义的函数GetImageData()说明了如何根据读取的OLE字段数据生成待显示的图像,需要注意的是该函数中使用的CBitmap类的变量Bitmap是预定义的一个全局变量:
BOOL CImageDlg::GetImageData(CByteArray&DBArray)
{
CByteArray Array;
Array.Copy(DBArray);
int HeaderLen=78+sizeof(BITMAPFILEHEADER);file://确定图像头信息的起始位置
Array.RemoveAt(0,HeaderLen);//移动到图像头信息的起始位置
BITMAPINFOHEADER&bmiHeader=*(LPBITMAPINFOHEADER)Array.GetData();
BITMAPINFO&bmInfo=*(LPBITMAPINFO)Array.GetData();
file://得到图像数据的头信息
int nColors=bmiHeader.biClrUsed?bmiHeader.biClrUsed:1<<bmiHeader.biBitCount;
file://确定图像的颜色数
LPVOID lpDIBBits;
if(bmInfo.bmiHeader.biBitCount>8)
lpDIBBits=(LPVOID)((LPDWORD)(bmInfo.bmiColors+bmInfo.bmiHeader.biClrUsed)+
((bmInfo.bmiHeader.biCompression==BI_BITFIELDS)?3:0));
else
lpDIBBits=(LPVOID)(bmInfo.bmiColors+nColors);
file://得到图像各个像素的具体数据
CClientDC dc(NULL);
HBITMAP hBmp=CreateDIBitmap(dc.m_hDC,
&bmiHeader,
CBM_INIT,
lpDIBBits,
&bmInfo,
DIB_RGB_COLORS);
file://生成位图句柄
Bitmap.Attach(hBmp);//将该句柄与定义的Bitmap对象联系在一起
Array.RemoveAll();file://释放内存
return TRUE;
}
有了上面的准备工作,现在可以实现图像的显示函数了,其实现如下:
void CImageDlg::OnShowImage()
{
CimageData db;//定义记录集对象
db.Open();打开数据库
GetImageData(db.m_Images);//根据记录集对象的成员变量生成图像对象
file://以下是在对话框的固定区域显示图像
CPaintDC dc(this);
if(!(Bitmap.m_hObject==NULL))
{CDC dcMem;
dcMem.CreateCompatibleDC(&dc);file://create a Memory Image
CBitmap*pbmpOld;
BITMAP BmpSize;
Bitmap.GetBitmap(&BmpSize);file://get Image Size
pbmpOld=dcMem.SelectObject(&Bitmap);
dc.StretchBlt(20,20,200,200,&dcMem,0,0,BmpSize.bmWidth,BmpSize.bmHeight,SRCCOPY);
dcMem.SelectObject(pbmpOld);
}
以上代码中使用的数据库为ACESS97,程序在windows98、Visual C++6.0环境下编译通过,运行正常。

相关文档
最新文档