zoukankan      html  css  js  c++  java
  • Delphi用ADOQuery将图片存取ACCESS简单示例《转》

    1.ACCESS数据表名test,字段id字符,字段photo为OLE

    2.在DELPHI窗体中添加ADOQuery1,OpenDialog1,Image1,Button1,Button2,Button3
    设置OpenDialog1的Filter为“JPEG文件(*.jpg;*.jpeg)|*.jpg;*.jpeg”
    设置Button1的Caption为“Open Image”
    设置Button2的Caption为“Save Image”

    设置Button3的Caption为“Show Image”

    代码如下:

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if OpenDialog1.Execute then
        Image1.Picture.LoadFromFile(OpenDialog1.FileName);
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    var ms:TMemoryStream;
    begin
      if Image1.Picture.Graphic <>nil then  
       begin
          ms:=TMemoryStream.Create ;
          Image1.Picture.Graphic.SaveToStream(ms);
          ADOQuery1.Close;
          ADOQuery1.SQL.Clear ;
          ADOQuery1.SQL.Add('insert into test(photo) values(:photo)');
          ADOQuery1.Parameters.ParamByName('photo').LoadFromStream(ms,ftBlob);
          ADOQuery1.execsql;
          Image1.Picture.Graphic:=nil ;  
       end
       else showmessage('Please choose a image first!');
    end;
    
    procedure TForm1.Button3Click(Sender: TObject);
    var ms:TMemoryStream;
        jpg:TJPEGImage;
    begin
      ADOQuery1.Close;
      ADOQuery1.SQL.Clear ;
      ADOQuery1.SQL.Add('select * from test');
      ADOQuery1.Open;
      if not ADOQuery1.FieldByName('photo').IsNull then
        begin
          ms:=TMemoryStream.Create ;
          jpg:=TJPEGImage.Create ;
          TBlobField(ADOQuery1.FieldByName('photo')).SaveToStream(ms);
          ms.Position :=0;
          jpg.LoadFromStream(ms);
          image1.Picture.Assign(jpg);
        end
      else image1.Picture.Graphic :=nil;
    end;

    ======================================================================================

    一、 原理介绍--流式数据的类型及其应用
    在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
    MyJPEG : TJPEGImage;
      MS : TMemoryStream;
    Begin
    Try
      MS := TMemoryStream.Create;
    TBlobField(Query1.FieldByName('Image')).SaveToStream(MS);
    MS.Position := 0;
    MyJPEG := TJPEGImage.Create;
        MyJPEG.LoadFromStream(MS);
    DBImage1.Picture.Bitmap.Assign(MyJPEG);
        //或是Sender.Picture.Assign(MyJPEG);
    Finally
      MS.Free;
    MyJPEG.Free;
    End;
    End;
    这段代码的主要作用是:首先将查询结果中的JPEG图像格式数据保存到TMemoryStream中去,
    然后设置数据指针在TMemoryStream中的位置为0;接着从TMemoryStream中读入相关数据,
    并把它们赋给TDBImage.Picture.Bitmap,这样一来就实现了将数据库中所存储的JPEG格式的
    数据转化为BMP格式,并在TDBImage中将图像显示出来。最后将TMemoryStream和TJPEGImage
    这两个对象释放掉。特别要注意的是不能在设计阶段设置TDBImage的DataField属性,而只能
    通过写代码的形式在运行阶段把利用流式数据所转化过来的新格式的图像数据赋给TDBImage.Picture.Bitmap。

    BTW:用到TBlobField的时候要在接口包含DB,用到TJPEGImage时要在接口包含Jpeg
  • 相关阅读:
    改写历史,永久删除git库的物理文件
    双调排序
    GitHub从无到有
    Nginx的安装与基本应用
    Django从无到有的艰苦历程
    pycharm 相关设置问题
    ORM介绍
    Django中的过滤器
    FBV和CBV的差异
    django中models field详解
  • 原文地址:https://www.cnblogs.com/LceMeaning/p/2877885.html
Copyright © 2011-2022 走看看