CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  数据库相关

高分悬赏!怎么把保存在数据库中的JPG图像读出来?DELPHI 5

楼主turbopeng(济元)2002-06-06 16:16:36 在 Delphi / 数据库相关 提问

ADO   +   ACCESS。OLE字段。  
  下面的代码是我保存进数据库的代码。请问怎么才能读出来呢并显示在IMAGE中呢?因为图片众多,所以不能保存成本地文件,要用流来解决,可是我折腾了一下午,还是没有解决。望高手帮忙!我用的是   5   ,不能用   6。如能解决,必然给分!  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
      photo:   TMemoryStream;  
  begin  
      ADOTable1.Append;  
      if   OpenDialog1.Execute   then  
          Image1.Picture.LoadFromFile(OpenDialog1.FileName);  
      photo   :=   TMemoryStream.Create;  
      Image1.Picture.Graphic.SavetoStream(photo);  
      TBlobField(ADOTable1.Fieldbyname('pic')).LoadFromStream(photo);  
      ADOTable1.Post;  
      photo.Clear;  
  end;  
  问题点数:99、回复次数:12Top

1 楼netlib(河外孤星)回复于 2002-06-06 16:22:12 得分 0

(query1.FieldByName('img')   as   TBlobField).SavetoStream(photo);  
  Image1.Picture.Graphic.loadfromstream(photo);Top

2 楼turbopeng(济元)回复于 2002-06-06 16:29:58 得分 0

我原来就是这么写的,但是显示“JPEG   ERROR   #41”Top

3 楼Mudeen(诸神的黄昏)回复于 2002-06-06 16:33:57 得分 0

use   jpegTop

4 楼netlib(河外孤星)回复于 2002-06-06 16:35:55 得分 0

直接(query1.FieldByName('img')   as   TBlobField).savetofile('E:\jjj.jpg')Top

5 楼turbopeng(济元)回复于 2002-06-06 16:37:15 得分 0

var  
      jpg:   TJpegImage;  
  begin  
      jpg   :=   TJpegImage.Create;  
      jpg.Assign(ADOTable1.Fieldbyname('pic'));  
      Image1.Canvas.Draw(0,   0,   jpg);   //   这里出错,报告说是只能画BITMAP  
      ...  
  end;Top

6 楼Tine2()回复于 2002-06-06 16:39:27 得分 0

你好,我是Tine.知道吗?Top

7 楼lxl(是我,不是风)回复于 2002-06-06 16:39:27 得分 55

试试这个:  
  var  
  jpeg:tjpegimage;  
  stream   :TMemoryStream;  
  begin  
  if   adoquery1jpg.BlobSize>0   then  
  begin  
  jpeg:=tjpegimage.Create;  
  stream   :=TMemoryStream.Create;  
  tblobfield(adoquery1.FieldByName('jpg')).savetostream(stream);  
  Stream.Seek(0,soFromBeginning);  
  jpeg.loadfromstream(stream);  
  image.Picture.Bitmap.Assign(jpeg);  
  jpeg.Free;  
  stream.Free;  
  end  
  else  
  image.Picture:=nil;  
  end;Top

8 楼turbopeng(济元)回复于 2002-06-06 16:46:31 得分 0

呵呵,知道啊。我现在不能用QQ啊。:(Top

9 楼Tine2()回复于 2002-06-06 16:53:09 得分 0

我想请教你一个问题:DCOM服务器的CallBack的技术怎样实现?  
  就是在Client端定义一个interface,然后让Server端能调用。Top

10 楼kplchx(lcx)回复于 2002-06-06 17:07:00 得分 44

因为存放图片的内容还含有图片文件的路径和文件名称,因此读出时应数据流  
  应该处理,从其JPG的标志开始截取数据流,其标志是'FFD8'  
  下面是个例子   access+delphi+ado  
   
  Chapter   three   of   the   free  
  Delphi   Database   Course   for   beginners.  
  Displaying   images   (BMP,   JPEG,   ...)   inside  
  an   Access   database   with   ADO   and   Delphi.  
   
  For   the   .zip   file   of   this   project   click   here.  
   
  }  
   
  unit   Unit1;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Classes,   Graphics,   Controls,   Forms,   Dialogs,  
      Buttons,   ExtCtrls,   StdCtrls,   Db,   ADODB,   Grids,   DBCtrls,   DBGrids;  
   
  type  
      TForm1   =   class(TForm)  
          ADOTable1:   TADOTable;  
          DataSource1:   TDataSource;  
          btnShowImage:   TButton;  
          ADOImage:   TImage;  
          ADOTable1Name:   TWideStringField;  
          ADOTable1Description:   TWideStringField;  
          ADOTable1Author:   TWideStringField;  
          ADOTable1Type:   TWideStringField;  
          ADOTable1Size:   TFloatField;  
          ADOTable1Cost:   TBCDField;  
          ADOTable1DateUpl:   TDateTimeField;  
          ADOTable1Picture:   TBlobField;  
          DBGrid1:   TDBGrid;  
          procedure   btnShowImageClick(Sender:   TObject);  
          procedure   FormCreate(Sender:   TObject);  
          procedure   FormDestroy(Sender:   TObject);  
      private  
          {   Private   declarations   }  
      public  
            {   Public   declarations   }  
      end;  
   
   
  const  
    JPEGstarts   =   'FFD8';  
    BMPstarts   =   '424D';     //BM  
   
  var  
      Form1:   TForm1;  
   
  implementation  
  uses   jpeg;  
    {$R   *.DFM}  
   
  function   JpegStartsInBlob   (PicField:TBlobField):integer;  
  var  
    bS           :   TADOBlobStream;  
    buffer   :   Word;  
    hx           :   string;  
  begin  
    Result   :=   -1;  
    bS   :=   TADOBlobStream.Create(PicField,   bmRead);  
    try  
      while   (Result   =   -1)   and   (bS.Position   +   1   <   bS.Size)   do  
      begin  
        bS.ReadBuffer(buffer,   1);  
        hx:=IntToHex(buffer,   2);  
        if   hx   =   'FF'   then   begin  
            bS.ReadBuffer(buffer,   1);  
            hx:=IntToHex(buffer,   2);  
            if   hx   =   'D8'   then   Result   :=   bS.Position   -   2  
            else   if   hx   =   'FF'   then   bS.Position   :=   bS.Position-1;  
        end;   //if  
      end;   //while  
    finally  
      bS.Free  
    end;     //try  
  end;  
   
  procedure   TForm1.btnShowImageClick(Sender:   TObject);  
  var  
      bS     :   TADOBlobStream;  
      Pic   :   TJpegImage;  
  begin  
      bS   :=   TADOBlobStream.Create(AdoTable1Picture,   bmRead);  
      try  
          bS.Seek(JpegStartsInBlob(AdoTable1Picture),   soFromBeginning);  
          Pic:=TJpegImage.Create;  
          try  
            Pic.LoadFromStream(bS);  
            ADOImage.Picture.Graphic:=Pic;  
          finally  
            Pic.Free;  
          end;  
      finally  
          bS.Free  
      end;  
  end;  
   
   
  procedure   TForm1.FormCreate(Sender:   TObject);  
  var   sDBPath,   sCons:   string;  
  begin  
  //change   the   sDBPath   to   point   to   your   database!  
  sDBPath   :=   'c:\!Gajba\About\aboutdelphi.mdb';  
  sCons   :=   'Provider=Microsoft.Jet.OLEDB.4.0;Data   Source='   +   sDBPath   +   ';Persist   Security   Info=False';  
   
  ADOTable1.ConnectionString   :=   sCons;  
  ADOTable1.TableName   :=   'Applications';  
  DataSource1.DataSet   :=   ADOTable1;  
  DBGrid1.DataSource   :=   DataSource1;  
   
  ADOTable1.Active:=True;  
  end;  
   
  procedure   TForm1.FormDestroy(Sender:   TObject);  
  begin  
      ADOTable1.Active:=False;  
  end;  
   
   
  //Extra!!   save   JPG   to   table  
  procedure   SaveJpegToTable(Table:   TADOTable;   PicField:TBlobField;   sPicPath:   string);  
  {  
  Usage:  
   
      SPicFileName   :=   'C:\!gajba\cdcovers\cdcover1.jpg';  
      SaveJpegToTable(ADOTable1,   ADOTable1Picture,   SPicFileName);  
  }  
  var  
      fS     :   TFileStream;  
  begin  
      fs:=TFileStream.Create(sPicPath,   fmOpenRead);  
      try  
        Table.Edit;  
        PicField.LoadFromStream(fs);  
        Table.Post;  
      finally  
        fs.Free;  
      end;  
  end;  
   
  Top

11 楼turbopeng(济元)回复于 2002-06-06 18:22:47 得分 0

再次感谢楼上的诸位!Top

12 楼turbopeng(济元)回复于 2002-06-06 18:27:55 得分 0

我这些时间一直都没有弄COM+,所以不会呀~~~:(Top

相关问题

  • Delphi数据库问题
  • Delphi数据库的问题?
  • DELPHI 的数据库问题
  • Delphi数据库问题!!!!!!!!!!!!
  • delphi数据库问题
  • Delphi数据库连接
  • 关于DELPHI数据库中,ACCESS数据库的问题?
  • 在DELPHI 7中还原数据库,数据库是ACCESS 2000
  • 能启动数据库吗?100分悬赏解决方案!
  • 数据库接口程序,高分悬赏

关键词

  • jpeg
  • delphi
  • 文件
  • 解决
  • access
  • adotable
  • twidestringfield
  • tblobfield
  • jpg
  • tjpegimage

得分解答快速导航

  • 帖主:turbopeng
  • lxl
  • kplchx

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo