Delphi存取图像完整解决方案

    技术2022-05-11  70

         对于涉及图像数据的数据库应用程序,图像数据的存取技术是一个关键。由于缺少技术文档及DEMO例程演示,为此笔者在网上搜索了相关资料,有的根本不能用,有的过于繁杂,有的应用范围太窄(如只能适用于BMP图像),有的写得过于简单理解起来十分困难。。。而且在网上这也是大家比较关心的一个问题。笔者对这个问题进行了反复实作和探索,下边笔者将通过一个完整的简单例子来说明如何保存和显示SQL数据库中的图像数据(同时包括BMP和JPEG两种格式)。 一、 创建演示数据库  在SQL SERVER中新建一演示数据库:Demo,并创建一数据表Picture1,结构如下: 字段名Dtata TypeIdentityId Int YesIsbmpTinyint MyimageImage     字段Isbmp是用来记录在Myimage中存入的图像的类型(0表JPEG,1表BMP,其它值表无图像),Isbmp数据类型选用整型Tinyint而末选用逻辑bit型主要是考虑到如下方法仍适用于ACCESS数据库。在SQL中打开表Picture1,添入几条记录,Myimage图像字段值暂不管,字段Isbmp值随便输入0和1之外的其它数。  二、 窗口设计  在DELPHI中新建一个工程,在FORM1上放置如表所示控件(考虑到TDBImage型控件不能正确显示JPEG型图像,所以选用Timage型控件显示所有类型图像)。 组件类别组件属性名属性值 用途说明TimagecaptionImage1显示图像nameImage1StretchTrue Tbuttoncaption选择图像选择图像nameselectimageTbuttoncaption保存图像保存图像到数据库namesavetodb TADOConnectioncaption Adoconnection1创建与数据库demo的连接nameAdoconnection1 Connectionstring见备注ConnectedTrueLoginpromptFalse TadotableCaptionAdotable1建立与表Picture1的连接nameAdotable1 Connection Adoconnection1TablenamePicture1Active TrueTdatasourceNameDatasource1建立数据源DatasetAdotable1TopenpicturedialogCaptionOpenpicturedialog1选择图像文件NameOpenpicturedialog1TdbgridCaption Dbgrid1显示记录NameDbgrid1DatasourceDatasource1

      备注: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); //选择图像beginif openpicturedialog1.Execute thenimage1.Picture.LoadFromFile(openpicturedialog1.FileName );end;

    procedure TForm1.savetodbClick(Sender: TObject); //保存图像varstrm:tmemorystream; ext:string;beginif image1.picture.Graphic <> nil then //避免image1中无图像保存出错beginext:=extractfileext(openpicturedialog1.FileName ); //取出文件的扩展名strm := tmemorystream.Create ;tryimage1.Picture.Graphic.SaveToStream(strm);adotable1.Edit ;strm.Position :=0;  tblobfield(adotable1.FieldByName('myimage')).LoadFromStream(strm);//如需直接由文件保存可采用如下注释行//TBlobField(adotable1.FieldByName('myimage')).LoadFromFile(OpenPictureDialog1.FileName);//以下记录保存到数据库的图像格式if uppercase(ext) = '.BMP' thenadotable1.FieldByName('isbmp').Value := 1 //BMP型图像数据else if (uppercase(ext) = '.JPG') OR ( uppercase(ext) = '.JPEG') Thenadotable1.FieldByName('isbmp').Value := 0; //JPEG型图像数据adotable1.Post ;finallystrm.Free ; //笔者发现如strm采用tblobstream类,程序运行到该语句会出现问题end;end;end;

      2. 图像数据的读取及显示  从数据库图像字段中读取数据然后在Image1中把图像显示出来的程序代码,笔者先尝试在Datasource1的OnDataChange事件中来完成,但会出错,后改写在adotable1的afterscroll事件中顺利完成。

    procedure TForm1.adoTable1AfterScroll(DataSet: TDataSet); //显示图像varstrm:tadoblobstream;jpegimage:tjpegimage;bitmap:tbitmap;beginstrm := tadoblobstream.Create(tblobfield(adotable1.fieldbyname('MYIMAGE')),bmread);try //try1strm.position :=0;image1.Picture.Graphic := nil; //清除图像// BMP、JPEG两种图像数据必需分别处理if adotable1.fieldbyname('isbmp').asstring ='1' then //BMP型图像数据begin //begin11bitmap := tbitmap.Create ;try //try11bitmap.LoadFromStream(strm);image1.Picture.Graphic := bitmap;finallybitmap.Free;end; //end try11end //end begin11else if adotable1.fieldbyname('isbmp').asstring ='0' then //JPEG型图像数据begin //begin12jpegimage := tjpegimage.Create ;try //try12jpegimage.LoadFromStream(strm);image1.Picture.Graphic := jpegimage;finallyjpegimage.Free ;end; //end try12end; //end begin12finallystrm.Free ;end; //end try1end;

      如果你想将数据库中的图像导出到外部文件中可采用如下关键语句:

    image1.Picture.SaveToFile(FileName );

      以上程序代码不但适用于SQL数据库,而且完全适用于ACCESS数据库,但创建ACCESS数据库时应注意图像字段的数据类型应为OLE型,数据库创建完成之后再将Adoconnection1连接到该ACCESS数据库即可运行。欲知详细情况,请索取源程序。以上提供了DELPHI利用Tsteam类存取JPEG、BMP图像到数据库的一种解决方案,笔者争取下文介绍DELPHI利用ASSIGN方法存取JPEG、BMP图像到数据库的另一解决方案。  以上程序代码在DELPHI6.0+SQL(或ACCESS)数据库下运行通过。

     


    最新回复(0)