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;