一、 创建演示数据库
在SQL SERVER中新建一演示数据库:Demo,并创建一数据表Picture1,结构如下:
字段名 | Dtata Type | Identity |
Id | Int | Yes |
Isbmp | Tinyint | |
Myimage | Image |
字段Isbmp是用来记录在Myimage中存入的图像的类型(0表JPEG,1表BMP,其它值表无图像),Isbmp数据类型选用整型Tinyint而末选用逻辑bit型主要是考虑到如下方法仍适用于ACCESS数据库。在SQL中打开表Picture1,添入几条记录,Myimage图像字段值暂不管,字段Isbmp值随便输入0和1之外的其它数。
二、 窗口设计
在DELPHI中新建一个工程,在FORM1上放置如表所示控件(考虑到TDBImage型控件不能正确显示JPEG型图像,所以选用Timage型控件显示所有类型图像)。
组件类别 | 组件属性名 | 属性值 | 用途说明 |
Timage | caption | Image1 | 显示图像 |
name | Image1 | ||
Stretch | True | ||
Tbutton | caption | 选择图像 | 选择图像 |
name | selectimage | ||
Tbutton | caption | 保存图像 | 保存图像到数据库 |
name | savetodb | ||
TADOConnection | caption | Adoconnection1 | 创建与数据库demo的连接 |
name | Adoconnection1 | ||
Connectionstring | 见备注 | ||
Connected | True | ||
Loginprompt | False | ||
Tadotable | Caption | Adotable1 | 建立与表Picture1的连接 |
name | Adotable1 | ||
Connection | Adoconnection1 | ||
Tablename | Picture1 | ||
Active | True | ||
Tdatasource | Name | Datasource1 | 建立数据源 |
Dataset | Adotable1 | ||
Topenpicturedialog | Caption | Openpicturedialog1 | 选择图像文件 |
Name | Openpicturedialog1 | ||
Tdbgrid | Caption | Dbgrid1 | 显示记录 |
Name | Dbgrid1 | ||
Datasource | Datasource1 |
备注:
adoconnection1.connectstring :=
'Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=demo;
Data Source=Mysqlserver'
Mysqlserver为SQL服务器的名称请据实际情况更改。
三、 程序代码(首先在单元文件接口部分的uses语句中添入JPEG单元引用)
1. 图像数据的选择及保存
procedure TForm1.selectimageClick(Sender: TObject); //选择图像 procedure TForm1.savetodbClick(Sender: TObject); //保存图像 |
2. 图像数据的读取及显示
从数据库图像字段中读取数据然后在Image1中把图像显示出来的程序代码,笔者先尝试在Datasource1的OnDataChange事件中来完成,但会出错,后改写在adotable1的afterscroll事件中顺利完成。
procedure TForm1.adoTable1AfterScroll(DataSet: TDataSet); //显示图像 var strm:tadoblobstream; jpegimage:tjpegimage; bitmap:tbitmap; begin strm := tadoblobstream.Create(tblobfield(adotable1.fieldbyname('MYIMAGE')),bmread); try //try1 strm.position :=0; image1.Picture.Graphic := nil; //清除图像 // BMP、JPEG两种图像数据必需分别处理 if adotable1.fieldbyname('isbmp').asstring ='1' then //BMP型图像数据 begin //begin11 bitmap := tbitmap.Create ; try //try11 bitmap.LoadFromStream(strm); image1.Picture.Graphic := bitmap; finally bitmap.Free; end; //end try11 end //end begin11 else if adotable1.fieldbyname('isbmp').asstring ='0' then //JPEG型图像数据 begin //begin12 jpegimage := tjpegimage.Create ; try //try12 jpegimage.LoadFromStream(strm); image1.Picture.Graphic := jpegimage; finally jpegimage.Free ; end; //end try12 end; //end begin12 finally strm.Free ; end; //end try1 end; |
如果你想将数据库中的图像导出到外部文件中可采用如下关键语句:
image1.Picture.SaveToFile(FileName ); |
以上程序代码不但适用于SQL数据库,而且完全适用于ACCESS数据库,但创建ACCESS数据库时应注意图像字段的数据类型应为OLE型,数据库创建完成之后再将Adoconnection1连接到该ACCESS数据库即可运行。欲知详细情况,请索取源程序。以上提供了DELPHI利用Tsteam类存取JPEG、BMP图像到数据库的一种解决方案,笔者争取下文介绍DELPHI利用ASSIGN方法存取JPEG、BMP图像到数据库的另一解决方案。
以上程序代码在DELPHI6.0+SQL(或ACCESS)数据库下运行通过。