为了显示SQL Server数据库中的jpg图片到image中,写了如下代码:
保存image1里面的图片
var
  MyJPEG:TJPEGImage;
  MS:TMemoryStream;
begin
  MyJPEG:=TJPEGIMage.Create;
  MS:=TMemoryStream.Create;
  try
    MyJPEG.Assign(Image1.picture.bitmap);
    MyJPEG.SaveToStream(MS);
    MS.position:=0;
    Adotable1.Append;
    Adotable1.FieldByName('编号').AsVariant := 2;
    TBlobField(Adotable1.FieldByName('照片')).savetostream(MS);
    AdoTable1.Post;
  finally
    MyJPEg.free;
    MS.free;
  end;
  Showmessage('保存完毕!');显示数据库中的图片,此时返回Jepg Error #41,不知是什么原因错误了,请指点!
var
  MyJPEG:TJPEGImage;
  MS:TMemoryStream;
begin
  MyJPEG:=TJPEGIMage.Create;
  MS:=TMemoryStream.Create;
  try
    TBlobField(ADOQuery1.FieldByName('照片')).savetostream(MS);
    MS.position:=0;
    MyJPEG.LoadFromStream(MS);
    Image1.picture.Bitmap.assign(MyJPEG);
  finally
    MyJPEg.free;
    MS.free;
  end;
end;

解决方案 »

  1.   

    保存图片应该用LoadFromStream,而不是SaveToStream,
    TBlobField(Adotable1.FieldByName('照片')).LoadFromStream(MS);你原来的语句并没有把图片写进数据库,读取时是空的,就报错了。
      

  2.   

    我觉得是这句错了:
    MyJPEG.Assign(Image1.picture.Graphic);
    你的语句取的是Bitmap,没有数据的。
    当然,你后面的语句也错了。应当是:
    Image.Picture.Graphic.LoadFromStrea(好像是这么写的)
      

  3.   

    谢谢,我现在已经把保存image1里面的jpg图片 这段代码改成
    var
      MyJPEG:TJPEGImage;
      MS:TMemoryStream;
    begin
      MyJPEG:=TJPEGIMage.Create;
      MS:=TMemoryStream.Create;
      try
        MyJPEG.Assign(Image1.picture.bitmap);
        MyJPEG.SaveToStream(MS);
        MS.position:=0;
        Adotable1.Append;
        Adotable1.FieldByName('编号').AsVariant := 2;
        TBlobField(Adotable1.FieldByName('照片')).LoadFromStream(MS);
        AdoTable1.Post;
      finally
        MyJPEg.free;
        MS.free;
      end;
      Showmessage('保存完毕!');
    end;但是读取的时候还是发生 Jepg Error #41 错误。
    如果按 jufeng_zhu 的方法把
    MyJPEG.Assign(Image1.picture.bitmap);改为MyJPEG.Assign(Image1.picture.Graphic);
    将无法保存该图片到SQL Server数据库,出错信息为"Bitmap image is not valid"
    请问是什么原因啊?
      

  4.   

    保存前
        MyJPEG.Assign(image1.picture.Bitmap);
        MyJPEG.CompressionQuality:=100;
        MyJPEG.Compress;
    试试
      

  5.   

    jpgstream:= TJPEGImage.Create;
        jpgstream.Assign(image1.picture.Bitmap);
        jpgstream.CompressionQuality:=100;
        jpgstream.Compress;
           Stream:=TMemoryStream.Create;
           jpgstream.SaveToStream(Stream);
           Stream.Position:=0;
           ADODataSet2.append;
           TBlobField(ADODataSet2.FieldByName(b3)).LoadFromStream(Stream);
           ADODataSet2.Post;我的保存jpg的全部代码!
      

  6.   

    qwertyasd , 我加了
     MyJPEG.CompressionQuality:=100;
     MyJPEG.Compress;
    还是报错啊,图片不能在image1里面显示出来
    你能把你的显示jpg的代码给我看看吗?
      

  7.   

    procedure Tscanfrm.keyChange(Sender: TObject);
    var
       jpgstream:TJPEGImage;
        Stream: TMemoryStream;
    begin
       try
              Stream:=TMemoryStream.Create;
              TBlobField(ADODataSet2.FieldByName(b3)).SaveToStream(Stream);
              Stream.Position:=0;
              jpgstream:= TJPEGImage.Create;
              jpgstream.LoadFromStream(Stream);
              image2.Picture.Assign(jpgstream);
            finally
                Stream.Free;
                jpgstream.Free;       
            end;
    end;
    调jpg得全部代码!
    给分吧!
      

  8.   

    应该是 MyJPEG.Assign(Image1.picture.Graphic);
      

  9.   

    保存图片为jpg到数据库!
    procedure Tscanfrm.Button14Click(Sender: TObject);
    var
       jpgstream:TJPEGImage;
       Stream: TMemoryStream;
       idh:pchar;
    begin
        if MessageDlg('保存此图片,请确认!',mtWarning,[mbYes, mbNo],0)=mrno then exit;
        StatusBar1.Panels[0].Text:='正在保存文件';
        StatusBar1.Refresh;
        jpgstream:= TJPEGImage.Create;
        jpgstream.Assign(image1.picture.Bitmap);
        jpgstream.CompressionQuality:=100;
        jpgstream.Compress;
        with ADODataSet2 do
           begin
            if  key.Text='0' then append else edit ;
            FieldValues[b1]:=ly.Text;
            FieldValues[b2]:=ly.Tag;
          end;
        try       Stream:=TMemoryStream.Create;
           jpgstream.SaveToStream(Stream);
           Stream.Position:=0;
           TBlobField(ADODataSet2.FieldByName(b3)).LoadFromStream(Stream);
           ADODataSet2.Post;
        finally
           jpgstream.Free;
           StatusBar1.Panels[0].Text:='宽度:'+inttostr(image1.Picture.Width)+'  高度:'+inttostr(image1.Picture.height);
        end;
        if key.text='0' then
            begin
            ADODataSet2.Last;
            pages.Caption:=inttostr(strtoint(pages.Caption)+1);
            page.caption:=pages.Caption
            end;
        key.text:=idh;
    end;从数据库读出jpg文件,并存为bmp.
    procedure Tscanfrm.keyChange(Sender: TObject);
    var
       jpgstream:TJPEGImage;
        Stream: TMemoryStream;
    begin
        if key.Text<>'0' then
          begin
            try
              Stream:=TMemoryStream.Create;
              TBlobField(ADODataSet2.FieldByName(b3)).SaveToStream(Stream);
              Stream.Position:=0;
              jpgstream:= TJPEGImage.Create;
              jpgstream.LoadFromStream(Stream);
              image2.Picture.Assign(jpgstream);
              image1.Picture.Bitmap.Width:=image2.picture.Width;
              image1.Picture.Bitmap.Height:=image2.picture.Height;
              image1.Left:=0;
              image1.Top:=0;          
              image1.Picture.Bitmap.Canvas.Draw(0,0,image2.Picture.Graphic);
              image1.Width:=image2.Picture.Width;
              image1.Height:=image2.Picture.Height;
              page.Caption:=inttostr(adodataset2.RecNo  );
              pages.Caption:=inttostr(adodataset2.RecordCount);
            finally
                Stream.Free;
                jpgstream.Free;
                image2.Picture:=nil;
            end;
            cmddel.Enabled:=true;
            Button14.Enabled:=true;
          end
        else
          begin
            cmddel.Enabled:=false;
            Button14.Enabled:=false;
            image1.Picture:=nil;
            image2.Picture:=nil;
            page.Caption:='0';
            pages.Caption:='0';
            StatusBar1.Panels[0].Text:='';      end;
    end;
    以上是我的全部代码,运行n遍了,绝对没问题,如果在出错说明是你哪写得不对,多试试
    我这也是经过多次试验才得出来的!
    另外在user加上jpeg
      

  10.   

    我用的是类似的代码也出同样的错误?我是delphi 7+sqlsever 2k ,xp