DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: maple909
今日帖子: 10
在线用户: 5
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 ganbing (干冰) ★☆☆☆☆ -
盒子活跃会员
2004/3/23 22:15:45
标题:
图像存取问题 浏览:2540
加入我的收藏
楼主: delphi程序中,图像是如何存取的
给点代码看看,谢谢

----------------------------------------------
尽情舒展,是一种向往,想去的地方、想拥有的感受,尽管追求!
作者:
男 lichen114 (me) ★☆☆☆☆ -
普通会员
2004/3/23 23:31:49
1楼: 我也想知道,怎么在程序中实现,在数据库中插入图片..
----------------------------------------------
me,now
作者:
男 sophia84 (sophia) ★☆☆☆☆ -
普通会员
2004/3/24 0:31:47
2楼: 在数据库插入图片可用包对象来处理,读取时为blob流文件。
具体读取过程如下:image1为Timage;
private声明:procedure showjpg;

function JpegStartsInBlob(PicField:TBlobField):integer;
var
    ghy: TADOBlobstream;
    buffer:Word;
    hx: string;
begin
    Result := -1;
    ghy := TADOBlobstream.Create(PicField, bmRead);
    try
     while (Result = -1) and (ghy.Position + 1 < ghy.Size) do
     begin
      ghy.ReadBuffer(buffer, 1);
      hx:=IntToHex(buffer, 2);
      if hx = 'FF' then begin
       ghy.ReadBuffer(buffer, 1);
       hx:=IntToHex(buffer, 2);
      if hx = 'D8' then Result := ghy.Position - 2
       else if hx = 'FF' then
             ghy.Position := ghy.Position-1;
      end; //if
     end; //while
     finally
      ghy.Free
     end;  //try
   end;

procedure TForm1.showjpg;
var
ghy:TADOBlobstream;
pic:tjpegimage;
begin
ghy := TADOBlobstream.Create(ADOQuery1DSDesigner8, bmRead);
try
  ghy.Seek(JpegStartsInBlob(ADOQuery1DSDesigner8),soFromBeginning);
  Pic:=TJpegImage.Create;
  try
   Pic.LoadFromStream(ghy);
   image1.Picture.Graphic:=Pic;

  finally
   Pic.Free;
  end;
finally
ghy.Free;
end;
end;
----------------------------------------------
-
作者:
男 sophia84 (sophia) ★☆☆☆☆ -
普通会员
2004/3/24 0:34:00
3楼: 不过根据本人的经验,还是在数据库中插入文档连接地址比较好,不是超连接,而是地址,然后在delphi主程序中Timage.picture.loadfromfile调用,这样可以减小数据库的大小,而且图片是独立的,刚才的源码仅支持JPG,换做调用文件支持的格式将更多
----------------------------------------------
-
作者:
男 ganbing (干冰) ★☆☆☆☆ -
盒子活跃会员
2004/3/24 9:30:48
4楼: 三楼的想法很好

----------------------------------------------
尽情舒展,是一种向往,想去的地方、想拥有的感受,尽管追求!
作者:
男 ganbing (干冰) ★☆☆☆☆ -
盒子活跃会员
2004/3/24 9:33:20
5楼: 我只是想知道,如何存入数据库的,类似于query1.fieldbyname['name'].asstring:=edit1.text  怎么写

----------------------------------------------
尽情舒展,是一种向往,想去的地方、想拥有的感受,尽管追求!
作者:
男 ganbing (干冰) ★☆☆☆☆ -
盒子活跃会员
2004/3/24 10:27:47
6楼: 想知道二楼"在数据库插入图片可用包对象来处理"

----------------------------------------------
尽情舒展,是一种向往,想去的地方、想拥有的感受,尽管追求!
作者:
男 ganbing (干冰) ★☆☆☆☆ -
盒子活跃会员
2004/3/24 21:33:18
7楼: 增加一、 原理介绍--流式数据的类型及其应用
在Dephi中提供了TStream来支持对流式数据的操作。TStream是万流之源。
但由于它是一个抽象类,故不能被直接使用;而要使用其相应的子类,
如:TFileStream 、TStringStream、TMemoryStream、TBlobStream、
TWinSocketStream和TOleStream。TStream提供了统一、简洁的方法来进行数据的读写。
1.)SaveToStream(Stream: TStream ); 作用:将类中的数据写到Stream的当前位置中
2.)LoadFromStream(Stream: TStream); 作用:从当前位置读入Stream里的数据
实际使用时我们基本上只要使用上面两个函数就可以了。

二、所遇到的问题及相应的解决方法
为了节省图像的存储空间和使用更加方便,决定采用JPEG这种图像格式。

(一)所遇到的问题

第一、在Delphi 5中进行画图所用到的组件是TImage,所生成的图像的格式为BMP格式,
而为了节省图像的存储空间,图像在数据库里存储的格式须为JPEG格式,这样就产生了
图像格式转化的需求;而TImage本身并不直接提供这两种图像格式之间的转化。

第二、怎样将存储在Microsoft Access数据库中的图像取出并且显示出来:在Delphi 5
中,能提供这种功能的组件是TDBImage,但该组件却存在着一个很大的缺陷:它所能显
示的图像类型只能是一些图标文件,元文件和BMP文件,而不能支持JPEG格式的图像在
该组件中的显示;但根据实际需要,在Microsoft Access数据库中所存储的图像数据却
是以JPEG格式保存的。

(二)相应的解决方法
为了解决上述两个问题,可以采用目前数据库中一种名为大二分对象(BLOB--Bina
ry Large Object),它是用来处理某些特殊格式的数据的。BLOB在数据库的表中实际上
是以二进制数据的形式存放的。为了处理BLOB字段,可以借鉴一些可视的桌面数据库的
方法。在这里,我们选择了通过内存流的方式来完成;使用内存流,可减少磁盘操作,
大大提高运行效率。
具体的过程和相关的程序代码如下:

1、如何实现在Microsoft Access数据库中的图像存储:
这里是利用TStream的子类TMemoryStream向Microsoft Access数据库中存储图像的。
下面的这段代码是在按了“保存”按钮之后所触发的事件处理程序:
procedure TForm1.Button1Click(Sender: TObject);
var
MyJPEG : TJPEGImage;
MS: TMemoryStream;
begin
MyJPEG := TJPEGImage.Create;
try
  with MyJPEG do
  begin
   Assign(Image.Picture.Graphic);
   MS:=TMemoryStream.create;
   SaveToStream(MS);
   MS.Position:=0;
        Table1.Edit;
         TBlobField(Table1.FieldbyName('Image')).LoadFromStream(MS);
         Table1.Post;
         messagebox(getactivewindow(),'图像保存完毕!','保存',mb_ok);
  end;
 finally
  MyJPEG.Free;
 end;
end;
在这段代码里TStream的子类TMemoryStream利用内存流起到了将BMP格式转化为JPEG格式
的中间桥梁的作用。

2、如何将图像从Microsoft Access数据库中取出并显示出来:
下面的这段代码是在按了“查看图像”按钮之后所触发的事件处理程序:
procedure TForm1.Button1Click(Sender: TObject);
var tempstream:TStringStream;
  tempjpeg:TJPEGImage;
begin
  try
    tempstream:=TStringStream.Create('');
    TBlobField(Query1.FieldByName('Image')).SaveToStream(tempstream);
    tempstream.Position:=0;
    tempjpeg:=TJPEGImage.Create;
    tempjpeg.LoadFromStream(tempstream);
    DBImage1.Picture.Bitmap.Assign(tempjpeg);
 finally
    tempstream.Free;
    tempjpeg.Free;
 end;
end;
这段代码的主要作用是:首先将查询结果中的JPEG图像格式数据保存到TStringStream中去,
然后设置数据指针在TStringStream中的位置为0;接着从TStringStream中读入相关数据,
并把它们赋给TDBImage.Picture.Bitmap,这样一来就实现了将数据库中所存储的JPEG格式的
数据转化为BMP格式,并在TDBImage中将图像显示出来。最后将TStringStream和TJPEGImage
这两个对象释放掉。特别要注意的是不能在设计阶段设置TDBImage的DataField属性,而只能
通过写代码的形式在运行阶段把利用流式数据所转化过来的新格式的图像数据赋给
TDBImage.Picture.Bitmap。   

 
 2004-3-4 16:31:24    动态加入图标加入Imagelist控件
var
FileName: AnsiString;
Ico:TIcon;
begin
FileName := 'D:\tools\Tencent\zhonghuimin.ico;
Ico:=TIcon.Create;
Ico.Handle:=ExtractIcon(Hinstance, pchar(FileName), 0);
{菜单自画}
 N12.ImageIndex:=ImageList1.AddIcon(Ico);
end;  

 
 2004-3-16 17:57:34    Delphi数据库应用程序开发中图像数据的存取技术Delphi数据库应用程序开发中图像数据的存取技术

 Delphi提供了数据访问(DataAccess)和数据控制(DataControls)的可视化控件,能够方便快捷地产生具有良好界面且功能强大的数据库应用程序。对于涉及图像数据(含Graphic字段)的数据库应用程序,如人事管理信息系统等,图像数据的存取技术是一个关键。然而,有关D
elphi下图象的存取,特别是图像的保存方面的技术各种资料上很少提及。下面,笔者结合一个简单的例子来说明。

   一、图像数据的保存
  1.创建一个含有Graphic字段的数据库列表。
  在WindowsISQ(或Databasedesktop)下createdatabasemydb.gdbcreatetablemyfrieds(namevarchar(15)notnull,telephonevarchar(
12),addressvarchar(30),zipvarchar(8),picturevarchar(15),imageblob);
  其中,picture字段用于保存图像的名称(包括路径),image(Graphic字符)则用于存储图像,其数据类型为“blob”。
  2.建立窗体(如图1所示),设置窗体中各控件的属性。
  该窗体的主要功能是将某人信息进行编辑和保存。需要注意的图像保存所用的图像框必须用TImage而不能用TDBImage,编辑框宜用Tedit而不宜用TDBEdit,这一点与图像的读取恰好相反。
  其中,各主要控件的属性设置如下:
  Datasource1.Dataset:=table1;
 Table1.Databasename:=mydb.gdb;
  Table1.Tablename:=myfriends;
  Table1.active:=true;
  其他诸如Caption之类的属性设置不再叙述。
  3.数据处理程序的建立。
  (1)图像( .bmp文件)打开的处理。
  procedureTForm1.pictopenbtnClick(Sender:TObject);
  beginopendialog1.execute;
  image1.picture.loadfromfile(opendialog1.filename);
 end;
  (2)图像保存的处理。
  图像保存的处理程序完成把在窗体1所编辑的信息包括图像保存到相应的数据库中,其关键是要定义一个Graphic类型的变量且该变量要用assing()函数传递到相应数据库中保存。具体程序如下:
  procedureTform1.Savebtnclick(sender:TObject);
  vargraphic1:TGraphic;
  begin
graphic1:=TGraphic.Create;
  graphic1.loadfromfile(opendialog1.filename);
  table1.insert;
  table1.fieldbyname(′name′).asstring:=edit1.text;
  table1.fieldbyname(′telephon′).asstring:=edit2.text;
  table1.fieldbyname(′address′).asfloat:=(edit3.text);
  table1.fieldbyname(′zip′).asfloat:=(edit4.text);
  table1.fields[4].assign(graphic1);
  table1.post;
  graphic1.free;
  end;

   二、图像数据的读取
  在数据库数据(包括Graphic字段的数据)的读取和浏览方面,Delphi这一具有强大代码自动生成功能的面向对象的开发工具的优越性得到淋漓尽致的体现。毫不夸张地说,不需要一条语句即可完成这一功能!
  建立窗体(如下图所示),设置各控件的属性。
  图中Table1和Datasource1的属性的设置与数据的保存部分(图1)相同,所不同的是数据库数据的读取时用TDBEdit和TDBImage控件而不用TEdit和TImage。控件TDBEdit和TDBImage只要将datafield属性设置为其相对应的域;TDBNavigator的datasouce属性设置为datasource1即可。  


----------------------------------------------
尽情舒展,是一种向往,想去的地方、想拥有的感受,尽管追求!
作者:
男 ganbing (干冰) ★☆☆☆☆ -
盒子活跃会员
2004/3/26 11:45:46
8楼:     var graphic1:TGraphic;
  begin
    graphic1:=TGraphic.Create;
  graphic1.loadfromfile(opendialog1.filename);
    table1.edit;
  table1.insert;
    table1.fieldbyname('picture′).assign(graphic1);
  table1.post;
  graphic1.free;
    end;
编译通过,运行产生错误提示abstract error
问题在娜?


----------------------------------------------
尽情舒展,是一种向往,想去的地方、想拥有的感受,尽管追求!
作者:
男 bios (阿贡) ★☆☆☆☆ -
盒子中级会员
2004/3/26 12:01:41
9楼: TGraphic是抽象类

用他的子类 看来很多人都没学过《面向对象》
----------------------------------------------
按此在新窗口浏览图片
按此在新窗口浏览图片
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2004/3/26 12:55:42
10楼: 要这么麻烦吗?其实这样做就可以了:
TBlobField(Table1.FieldbyName('Image')).LoadFromFile(文件名);
TBlobField(Table1.FieldbyName('Image')).SaveToFile(文件名);
然后你自己处理显示;
如果你存在数据库中的是BMP格式的图片,则可用TDBImage控件来实现,很简单的.
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 ganbing (干冰) ★☆☆☆☆ -
盒子活跃会员
2004/3/26 19:14:19
11楼: 10楼,编译提示没有LoadFromFile方法阿,怎么回事?

----------------------------------------------
尽情舒展,是一种向往,想去的地方、想拥有的感受,尽管追求!
作者:
男 ganbing (干冰) ★☆☆☆☆ -
盒子活跃会员
2004/3/26 19:15:09
12楼: 9楼说得没错,用TPicture类就可以了

----------------------------------------------
尽情舒展,是一种向往,想去的地方、想拥有的感受,尽管追求!
作者:
男 ganbing (干冰) ★☆☆☆☆ -
盒子活跃会员
2004/3/29 14:12:30
13楼: TBlobField(Table1.FieldbyName('Image')).LoadFromFile(opendialog1.filename);
运行,向数据库中添加数据,提示错误:invalid blob length
什么问题, 我的数据库是sqlserver7,字段数据类型为image


----------------------------------------------
尽情舒展,是一种向往,想去的地方、想拥有的感受,尽管追求!
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行62.5毫秒 RSS