Delphi存取图像完整解决方案 |
关于 波及图像数据的数据库 利用程序,图像数据的存取技术是一个 要害 。因为 缺乏技术文档及DEMO例程演示,为此小编在网上查找了 有关 材料,有的 根本不能用,有的过于 冗长,有的 利用 规模太窄(如不得不 实用于BMP图像),有的写得过于 方便 了解起来非常 困苦 。 。 。并且在网上这也是大家 比较关怀的一个问题 。小编对这个问题进行了 反复实作和探究,下边小编将通过一个 完全的 方便例子来 注明如何 保留和显示SQL数据库中的图像数据(同时包含BMP和JPEG两种 格局) 。 一、 缔造演示数据库 在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); // 取舍图像 begin if openpicturedialog1.Execute then image1.Picture.LoadFromFile(openpicturedialog1.FileName ); end; procedure TForm1.savetodbClick(Sender: TObject); // 保留图像 var strm:tmemorystream; ext:string; begin if image1.picture.Graphic <> nil then //幸免image1中无图像 保留出错 begin ext:=extractfileext(openpicturedialog1.FileName ); // 存入文件的 扩大名 strm := tmemorystream.Create ; try image1.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' then adotable1.FieldByName('isbmp').Value := 1 //BMP型图像数据 else if (uppercase(ext) = '.JPG') OR ( uppercase(ext) = '.JPEG') Then adotable1.FieldByName('isbmp').Value := 0; //JPEG型图像数据 adotable1.Post ; finally strm.Free ; //小编发现如strm采纳tblobstream类,程序运行到该语句会浮现问题 end; end; end; |