http://blog.sina.com.cn/s/blog_693cf1cf0100plkq.html

对于涉及图像数据的数据库应用程序,图像数据的存取技术是一个关键。由于缺少技术文档及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;

  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)数据库下运行通过。

Delphi图像存取另类解决方案

在前文中,提供了一种DELPHI存取JPEG、BMP图像到数据库的解决方案,虽然它适用于ACCESS和SQL数据库,但它并不适用于所有数据库(比如PARADOX数据库中的GRAPHIC图像字段就不能采用该方法存取图像数据),下文将介绍DELPHI利用ASSIGN方法存取JPEG、BMP图像到数据库的另一解决方案来进行补充完善。演示数据库结构和窗口界面设计同前文,不再重述,将单元的相应程序代码作如下更换:

  1. 图像数据的选择及保存

  procedure Tform1.selectimageClick(Sender: TObject); //选择图像
begin
if openpicturedialog1.Execute then
image1.Picture.LoadFromFile(openpicturedialog1.FileName );
end;
procedure Tform1.savetodbClick(Sender: TObject); //保存图像到数据库
var
ext:string;
begin
if image1.picture.Graphic <> nil then //避免image1中无图像保存出错
begin
adotable1.Edit ;
adotable1.FieldByName('myimage').Assign(image1.Picture.Graphic);
//以下记录保存到数据库的图像格式
ext:=extractfileext(openpicturedialog1.FileName ); //取出文件扩展名
if uppercase(ext) = '.BMP' THEN
adotable1.FieldByName('isbmp').VALUE := 1 //BMP型图像数据
ELSE IF (UPPERCASE(EXT) = '.JPEG') OR (UPPERCASE(EXT) = '.JPG') THEN
adotable1.FieldByName('isbmp').VALUE := 0; //JPEG型图像数据
ADOTABLE1.Post ;
end;
end;

  2. 图像数据的读取及显示

  procedure Tform1.ADOTable1AfterScroll(DataSet: TDataSet); //ADOTable1的AfterScroll事件方法程序
 var
  jpegimage:tjpegimage;
 begin
  image1.Picture.Graphic :=nil;
  //下边BMP、JPEG两种图像数据必需分别处理
  if adotable1.fieldbyname('isbmp').Asstring = '1' then //BMP型图像数据
   image1.Picture.bitmap.Assign(adotable1.fieldbyname('myimage'))
   //上边语句中的bitmap不能为graphic,否则会出错
  else if adotable1.fieldbyname('isbmp').asstring = '0' then //JPEG型图像数据
   begin //begin2
    jpegimage := tjpegimage.Create ; //通过jpegimage将图像显示在image1,否则会出错
    try
     jpegimage.Assign(adotable1.fieldbyname('myimage'));
     image1.Picture.Graphic :=jpegimage;
    finally
     jpegimage.Free ;
    end; //end try
  end; //end begin2
end;

  注:别忘了在单元文件接口部分的uses语句中添入JPEG单元引用。

  以上程序代码在DELPHI6.0+SQL(或ACCESS或PARADOX)数据库下运行通过。

Delphi存取图像完整解决方案相关推荐

  1. delphi mysql 图片_Delphi实现在数据库中存取图像

    本实例演示如何在数据库中存取图像文件. 向窗体上添加一个TListBox组件.一个TImage组件和一个TTable组件,设计完成的主界面. 本系统中需要设计一个新的基于Paradox 7的数据库Im ...

  2. 机器视觉检测系统完整解决方案以及开发流程

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 第一步是确定要求并确定是否可行 机器视觉一词可以想象是具有一组眼睛 ...

  3. 提供“以图搜图”完整解决方案,博云视觉让各行业都可以方便地“以图搜图”

    近年来随着移动电商的兴起,以图搜图技术也开始逐步得到应用,如百度识图.微信扫一扫.淘宝拍立淘和京东拍照购等,然而以图搜图技术门槛高,周期长,还没有大范围普及.创始团队来自北大数字视频编解码国家工程实验 ...

  4. 差异分析完整解决方案

    差异分析完整解决方案 写在前面 最初这份脚本是这样的:R语言一键批量完成差异统计和可视化,当时我们发布的,但是我封装的比较严重,每个步骤不能分开跑,只能按照流程从一而终,后来我做升级版:查看升级版本, ...

  5. XP局域网访问无权限、不能互相访问问题的完整解决方案

    XP局域网访问无权限问题的完整解决方案: 1:用管理员账户登录系统 2:在"开始"-- "运行"里输入 GPEDIT.MSC 目的是打开组策略选项 3:依次展开 ...

  6. 基于tcpdump的Android智能移动终端数据包捕获完整解决方案

    基于tcpdump的Android智能移动终端数据包捕获完整解决方案 参考文章: (1)基于tcpdump的Android智能移动终端数据包捕获完整解决方案 (2)https://www.cnblog ...

  7. 年末福利,C/S应用升级更新完整解决方案放送

    年末福利,C/S应用升级更新完整解决方案放送 参考文章: (1)年末福利,C/S应用升级更新完整解决方案放送 (2)https://www.cnblogs.com/wdfrog/p/3457182.h ...

  8. Win10系统下软件UI显示不完整解决方案

    Win10系统下软件UI显示不完整解决方案 参考文章: (1)Win10系统下软件UI显示不完整解决方案 (2)https://www.cnblogs.com/wxjnew/p/5079726.htm ...

  9. 网易NEI在面临前后端分离问题,所提供的完整解决方案

    内容来源:2018 年 1 月5 日,网易NEI产品负责人包勇明在"2018移动技术创新大会"进行<网易高效多端应用协作开发实践>演讲分享.IT 大咖说(微信id:it ...

最新文章

  1. 2021-2027年中国医疗旅游业投资分析及前景预测报告
  2. 【CSDN2012年度博客之星】需要您的一票,感谢大家的支持
  3. 红警1开源放出源码,4K高清重制版登顶Steam畅销榜!网友:青春回来了
  4. python3.6.5安装教程-Centos7 安装Python3.6.5
  5. Ubuntu apt安装/卸载软件和设置软件源
  6. ITK:用常量填充图像
  7. 国内git clone报错问题解决办法
  8. 对while((pid = waitpid(-1, stat, WNOHANG)) 0)不懂的地方,现在懂了
  9. java内存泄露 垃圾回收_Java面试中底层垃圾回收、代码安全、内存泄露
  10. java canvas数组_java数组
  11. Android自定义视频播放器
  12. Eclipse启动时总是提示“subversive connector discovery”解决方案
  13. eop 文件打包下载大全 - 9000多首歌曲打包免费百度云下载
  14. 「案例分析」生鲜行业B2B供应链平台开发案例
  15. N4110解决WIN10黑屏问题
  16. mysql按周几查询时间戳转周几星期
  17. 【luminate primordial】苏州之行
  18. 3ds运行linux,3ds自制操作软件
  19. 探索:使用北鲲云平台利用Gaussian16进行HAT反应过渡态的寻找
  20. 把矩阵化成行最简型(伪)

热门文章

  1. 软件开发的N种基础武器 - 最新清单
  2. apache .htaccess 禁止访问某目录方法
  3. Jackson 框架,轻易转换JSON
  4. 条款02:尽量以const,enum,inline代替#define
  5. C#拾遗系列(3):构造函数
  6. 发布:IE自动打印插件
  7. OC基础回想(十二)协议
  8. 下载和安装Nginx之配置选项
  9. 第十二周项目4-点、圆的关系
  10. jquery中offset和position的区别