问题是:
使用DBImage控件如何将一幅图片(如.bmp文件)保存到数据库中?看了帮助也找不到答案,请指点!!

解决方案 »

  1.   

    这是我以前做过的项目中的部分代码,能存储bmp和jpg格式图片,在数据库要设一个字段来判断存入的图片是否为:bmp格式。
    procedure Tfrm_Main.BTNSelectPhotoClick(Sender: TObject);
    begin
    if OpenPictureDialog1.Execute then   Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);end;procedure Tfrm_Main.BtnSaveToDBClick(Sender: TObject);
    var
      ext:string;
    begin
      if image1.Picture.Graphic <>nil then
      begin
        try
        DM.ADOConnection.BeginTrans  ;
        DM.ADODataSet_classMate.Edit ;
           DM.ADODataSet_classMate.FieldByName('相片').Assign(image1.Picture.Graphic);
           //以下记录保存到数据库的图像格式
           ext:=extractfileext(openpicturedialog1.FileName);
           if uppercase(ext) = '.BMP' THEN
              DM.ADODataSet_classMate.FieldByName('isbmp').Value :=1
              ELSE IF (UPPERCASE(EXT) = '.JPEG') OR (UPPERCASE(EXT) = '.JPG') THEN
                DM.ADODataSet_classMate.FieldByName('isbmp').Value :=0;
        DM.ADODataSet_classMate.Post ;
        DM.ADOConnection.CommitTrans ;
        except
        DM.ADOConnection.RollbackTrans ;
        showmessage('图片保存失败!');
        end;//try
      end;
    end;
      

  2.   

    参考如下这篇文章http://expert.csdn.net/Expert/topic/2438/2438703.xml?temp=.3021204
      

  3.   

    //记得加上uses jpeg ;
    //其中有些地方不是太严密,回去修改下。。
    //delphi7+ sql2000通过.可以保存jpeg,jpg,bmp三种格式。unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, jpeg,DB, ADODB, ExtCtrls, Buttons, Grids, DBGrids,
      DBCtrls;type
      TForm1 = class(TForm)
        ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
        Button1: TButton;
        OpenDialog1: TOpenDialog;
        Edit1: TEdit;
        Image1: TImage;
        Image2: TImage;
        BitBtn1: TBitBtn;
        DBGrid1: TDBGrid;
        DataSource1: TDataSource;
        ADOQuery1pic: TBlobField;
        ADOQuery1borj: TStringField;
        procedure Button1Click(Sender: TObject);
        procedure BitBtn1Click(Sender: TObject);  private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      s:string;
      s1:string;
    implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
    bitmap1:tbitmap;
    pjpg:tjpegimage;
    pic:TMemoryStream;begin
    pjpg:=tjpegimage.Create;
    if opendialog1.Execute
        then
         s:=opendialog1.FileName ;
         s1:=extractfileext(s);
             
         if (uppercase(s1) ='.JPG' ) or (uppercase(s1)='.JPEG') // 图片格式一定要大写
           THEN
             begin
                  pjpg.LoadFromFile(s );
                  pic:=TMemoryStream.Create;
                  pjpg.SaveToStream(pic);
                  image1.Picture.Bitmap.Assign(pjpg);              pic.Position:=0;
                  adoquery1.Insert ;
                  adoquery1.FieldByName('borj').VALUE := 2;
                  TBlobField(adoquery1.FieldByName('pic')).LoadFromStream(pic);
                  adoquery1.post;
                  pic.Free;
                  pjpg.free;
            end ;    if (uppercase(s1)='.BMP')    then           begin
                  edit1.Text :=uppercase(s1);             image1.Picture.LoadFromFile(s);
                 adoquery1.Insert ;
                 adoquery1.FieldByName('pic').Assign(image1.Picture.Graphic);
                 adoquery1.FieldByName('borj').VALUE := 3;             adoquery1.Post ;
              end;
     end;  procedure TForm1.BitBtn1Click(Sender: TObject);   var
        jpeg:tjpegimage;
          begin
           image1.Picture.Graphic :=nil;
                with adoquery1 do
                     begin
                        if adoquery1.FieldByName('borj').Value =3   // bmp
                        then
                         image2.Picture.Bitmap.Assign(fieldbyname('pic'))  ;                     if adoquery1.FieldByName('borj').Value =2  //jpge;                     then
                            begin
                                   jpeg:=tjpegimage.Create ;
                                    try
                                     jpeg.Assign(adoquery1.FieldByName('pic') );
                                      image2.Picture.Graphic:=jpeg;
                                       finally
                                       jpeg.Free ;
                                     end;
                            end;                 end ;
                        end;end.
      

  4.   

    sql 2000 中的图片字段类型为 image 类型。。
      

  5.   

    对了,我上边用的是 image 控件。dbimage 不支持 .jpeg和jpg
      

  6.   

    回复人: boytomato(深爱一人叫颖的女孩!) ( ) 信誉:105  
     同意!我就是这样做的!
    还可以!
      

  7.   

    dbimage不支持jpg,你可以对jpg进行转换,在显示时转换成BMP,看看图形处理的图片类型转换
      

  8.   

    推荐在存入数据库的时候通通存为JEPG的流,这样体积小
      

  9.   

    其实和保存文本数字一样啊.
    bmp.loadfrimfile('youfilename');
    adoquery1.close;
    adoquery1.sql.clear;
    adoqury1.sql.add('insert into youtablename values(:p1,:p2,:p3');
    adoqury1.parameter.parabyname('p1').value:=edit1.text;
    adoquery1.parameter.parabyname('p2').value:=edit2.text;
    adoquery1.parameter.parabyname('p3').assign(bmp);
    try
      adoquery1.excesql;
    except
      end;
      

  10.   

    先将图片转化为字符串(hex)然后存入数据库,
      

  11.   

    Image1.Picture.LoadFromFile(OpenPictureDialog1.FileNam
    或者直接存路径也可,只是网路路径你得保存主机名和路径
    而且还得解析出真正得路径来
      

  12.   

    boytomato(深爱一人叫颖的女孩!) 
    ADOQuery1pic: TBlobField;
    ADOQuery1borj: TStringField;
       这是哪里来的组件????? 
      

  13.   

    同意DelphiStudy(学无止境*学以致用)的观念
      

  14.   

    Procedure..............................
    var
      Simage:TMemoryStream;
    begin
      Simage:=TMemoryStream.Create;
      Simage.LoadFromFile('c:\aaa.bmp');
      Simage.Position:=0;
      try
        ADOQuery.Open;
        ADOQuery.Append;
        TBlobField(ADOQuery.FieldbyName('Photo')).LoadFromStream(Simage);
        ADOQuery.Post;
        Simage.Free;
       except
          MessageDlg('保存图像失败,请重试!', mtInformation,[mbOK],0);
       end;end;
    ////////////////////////////////////////////////////////////////////////////////////////////procedure TForm1.Button3Click(Sender: TObject);
    var
       bmp : TBitMap;
    begin
      if OpenDialog1.Execute then
      begin
        bmp := TBitMap.Create;
        bmp.LoadFromFile(OpenDialog1.FileName);
        Image1.Picture.Bitmap := bmp;
        bmp.Free;
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      MaxNo : Integer;
      MStream:TMemoryStream;
    begin
      With DataModule1.Query1 do
      begin
        Close;
        SQL.Clear;
        SQL.Add('select Max(No) from testblob');
        if Not Prepared then Prepared := True;
        Open;
        MaxNo := Fields[0].AsInteger;
      end;
      MStream := TMemoryStream.Create;
      Image1.Picture.Bitmap.SaveToStream(MStream);
      ShowMessage(IntToStr(MStream.Size));
      MStream.Position := 0;
      DataModule1.Table1.Insert;
      DataModule1.Table1.FieldByName('No').AsInteger := MaxNo + 1;
      //DataModule1.Table1.Fields[1].Assign(Image1.Picture.Bitmap);
      //TBlobField(DataModule1.Table1.FieldByName('Image')).LoadFromStream(MStream);
      try
        DataModule1.Table1.Post;
      except
        ON E:Exception do
          begin
           MStream.Free;
           Showmessage(E.Message);
           Exit;
          end;
      end;
      MStream.Free;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      DataModule1.Table1.Delete;
    end;procedure TForm1.Button4Click(Sender: TObject);
    var
      BlobS : TBlobStream;
    begin
      Image1.Hide;
      //Image1.Picture.Bitmap.FreeImage;
      BlobS := TBlobStream.Create(TBlobField(DataModule1.Table1.FieldByName('Image')),bmRead);
      Image1.Picture.bitmap.LoadFromStream(BlobS);
      Image1.Refresh;
      Image1.Show;
      BlobS.Free;
    end;procedure TForm1.Button5Click(Sender: TObject);
    var
      MaxNo : Integer;
      MStream:TStringStream;
    begin
      With DataModule1.Query1 do
      begin
        Close;
        SQL.Clear;
        SQL.Add('select Max(No) from testblob');
        if Not Prepared then Prepared := True;
        Open;
        MaxNo := Fields[0].AsInteger;
      end;
      MStream := TStringStream.Create('');
      Image1.Picture.Bitmap.SaveToStream(MStream);   //注意这里
      ShowMessage(IntToStr(MStream.Size));
      MStream.Position := 0;
      DataModule1.Query1.Active := False;
      DataModule1.Query1.Close;
      DataModule1.Query1.SQL.Clear;
      DataModule1.Query1.SQL.Add('Insert into testblob values(:No,:Image)');
      DataModule1.Query1.ParamByName('No').AsInteger := MaxNo + 1;
      DataModule1.Query1.ParamByName('Image').AsBlob := MStream.DataString;
      DataModule1.Query1.Prepare;
      DataModule1.Query1.ExecSQL;
      DataModule1.Table1.Refresh;
    end;像这样子试试
    如果是jpg,就先将它转换为bmp,再保存.
      

  15.   

    var
      MemStream: TMemoryStream;
    begin
      if OpenPictureDialog1.Execute then
      begin
        for I := 0 to OpenPictureDialog1.Files.Count - 1 do     //添加文件
        begin
          MemStream := TMemoryStream.Create;              //创建流
          try
            MemStream.LoadFromFile(OpenPictureDialog1.Files[I]);  //将文件读到流中去
            MemStream.Seek(0, soFromBeginning);
            Compress(MemStream);                 //压缩文件
            MemStream.Seek(0, soFromBeginning);
            with ADOQuery2 do
            begin
              Append;
              TBlobField(FieldByName('图片)).LoadFromStream(MemStream);
              ADOQuery2.Post;
            end;
          finally
            MemStream.Free;
          end;
        end;
      end;//*****************************************COMPRESS函数
    procedure Compress(var CompressedStream: TMemoryStream);
    var
      SourceStream: TCompressionStream;
      DestStream: TMemoryStream;
      Count: Integer;
    Begin
      Count := CompressedStream.Size;
      DestStream := TMemoryStream.Create;
      SourceStream:=TCompressionStream.Create(clMax, DestStream);
      Try
        CompressedStream.SaveToStream(SourceStream);
        SourceStream.Free;
        CompressedStream.Clear;
        CompressedStream.WriteBuffer(Count, SizeOf(Count));
        CompressedStream.CopyFrom(DestStream, 0);
      finally
        DestStream.Free;
      end;
    end;建议这样使用:)))
      

  16.   

    如果喜欢用控件的话,去Delphi园地,载一个ImageEn就可以很方便的实现你的目的了
      

  17.   

    建议不要将图片放入数据库中,可以在表中保存图片的路径,将图片放在服务器上其他位置。如果一定要存,应该用二进制类型来存,即blob型;在SQl中有Image类型可以直接使用。
      

  18.   

    lzy6204(学无止境) :
    compress后怎么读出来啊
      

  19.   

    to  boytomato(深爱一人叫颖的女孩!) 
    多谢你的方法,我现在将文件里的图片存入数据库没有问题了,但是我所需要的不是将文件里的图片存到数据库,而是要能在程序运行后,可以随时用抓图的方法获得图片,并将其存入数据库中,也就是说要在不知道文件路径的情况下将图片存到数据库中,请问你有什么办法吗?也麻烦其他高手帮忙指点,多谢了!