我用access做数据库存储图片的字段类型为ole型
保存的代码如下:
var
   strm: TMemoryStream;
   myjpeg: TJPEGImage;
begin
//ExtName是一个全局变量,它通过ExtractFileExt(openpicturedialog1.FileName)获得扩展名; 
   if (ExtName = '.jpg') then
     begin
       ClientDataSet1.Edit;
       strm := TMemoryStream.Create;
       myjpeg := TJPEGImage.Create;
       myjpeg.Assign(image1.Picture.Graphic);
       myjpeg.SaveToStream(strm);
       strm.Position := 0;
       tblobfield(ClientDataSet1.FieldByName('相片')).LoadFromStream(strm);
       strm.Free;
       ClientDataSet1.post;
    end
end; 
每次保存是都提示"Bitmap image is not valid"这是为什么?我该怎样做才行?谢谢!

解决方案 »

  1.   

    to luxuewei5214 
    我用流保存*.bmp文件没问题啊!
      

  2.   

    var
      Stream:TMemoryStream;
      Jpg:TjpegImage;
    begin
      try
        ADOQuery2.Close;
        ADOQuery2.SQL.Clear;
        ADOQuery2.SQL.Add('');
        ADOQuery2.Open;
        if not ADOQuery2.FieldByName('pic').IsNull then begin
          if ADOQuery2.FieldByName('pic_type').AsInteger = 2 then begin
            try
              Stream:=TMemoryStream.Create;
              Jpg:=TjpegImage.Create;
              TBlobField(ADOQuery2.FieldByName('pic')).SaveToStream(Stream);    // 显示的转换为BlobField并保存到内存流
              Stream.Position :=0;
              jpg.LoadFromStream(Stream);
              image1.Picture.Assign(Jpg);
            finally
              Stream.Free;
              Jpg.Free;
            end;
          end else if ADOQuery2.FieldByName('pic_type').AsInteger = 1 then begin
            Image1.Picture.Bitmap.Assign(ADOQuery2.FieldByName('pic'));
          end else begin
            image1.Picture := nil;
          end;
        end else begin
          image1.Picture := nil;
        end;
      except
        common.InfoMessage('提取图片数据失败!');
        exit;
      end;
    var
      Stream:TMemoryStream;
      ext:string;
      pictype: integer;
    begin
      try
        try
          ext:=extractfileext(openpicturedialog1.FileName);
          if ext = '' then exit;
          if uppercase(ext) ='.BMP' then begin
            pictype := 1;
          end else if (uppercase(ext) = '.JPEG') or (uppercase(ext) = '.JPG') then begin
            Pictype := 2;
          end;
          Stream := TMemoryStream.Create;
          Image1.Picture.Graphic.SaveToStream(Stream);
          ADOQuery1.Close;
          ADOQuery1.SQL.Clear;
          ADOQuery1.SQL.Add('update member set pic =:pic,pic_type =:pictype where ---');
          ADOQuery1.Parameters.ParamByName('pic').LoadFromStream(Stream,ftBlob);
          ADOQuery1.Parameters.ParamByName('pictype').Value := pictype;
          ADOQuery1.ExecSQL;
        finally
          Stream.Free;
        end;
      except
        InfoMessage('保存图片失败!');
        exit;
      end;
    给你个现成的,我的数据库是sql
      

  3.   

    to rong451 
    谢谢你的代码
    可我想知道我的代码有何问题?
      

  4.   

    代码没有什么问题(myjpeg资源要释放),估计问题所在于你用 TDBImage 绑定到 TClientDataSet 的 pic 字段进行显示图片,如有,把界面上的TDBImage删除或者把其DataSource清空,然后再运行你的代码,确认问题所在。
      

  5.   

    to lynmison 
    你说的没错!确实是DBImage的问题,是不是DBImage不能显示jpg文件.
      

  6.   

    DBImage好像不能显示JPEG格式,你可以用Image进行显示,简单的做法就是记录中增加图片格式信息,便于在显示的时候处理。