我专门送分:Blob字段的读取(50分)

  • 主题发起人 主题发起人 W1979
  • 开始时间 开始时间
W

W1979

Unregistered / Unconfirmed
GUEST, unregistred user!
我读DBDEMOS里的表的blob字段保存到文件
我用了两种方法都不成功;只有我自己放进去的图片,才能被读出
1
tblobfield(table1.FieldByName('Graphic')).savetofile
('c:/temp/W1979.bmp');
2.
try
ff:=TFilestream.Create('c:/temp/W1979.bmp',fmCreate);
tblobfield(table1.FieldByName('Graphic')).savetostream(ff);
finally
ff.free;
end;
我想这与放进去时的文件属性有关,但我又无法知道它原来属性的
不知该怎么做?

 
请问你用的数据库是什么,我用ACCESS时一点问题也没有
 
我用的paradox,把blob 字段保存到文件后用看图工具看不到,
原样存到表中又看到了
 
好象是说stream保存的文件头部有一些stream的信息,要用stream.seek

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;
 
我试了为什么还不行?
我还试了sql server,access,用ado连接的,读不出来,直接报错
 
才50分……………………
我却辛苦的研究了七天,
分太少了,
不过,我可以提醒你,使用TMemoryStream可以
但 LOAD 与 SAVE 只用一次!

 
我看了一下honghs的回答:
是队的!
 
还是不行,报错说jpeg error #41,这是我的代码

procedure TForm1.Button4Click(Sender: TObject);
var mem:Tmemorystream;
jj:TjpegImage;
begin
try
mem:=Tmemorystream.Create;
jj:=TJpegImage.create;
tblobfield(table1.FieldByName('Graphic')).savetostream(mem);
mem.Seek(0,soFromBeginning);
jj.LoadFromStream(mem);
image1.Picture.Bitmap.Assign(jj);
finally
jj.free;
mem.Free;
end;
end;
不知错在哪里?
 
哪还不行,我觉得已经可以了。我在听
 
>>image1.Picture.Bitmap.Assign(jj);改为
image1.Picture.metafile.Assign(jj)试试……
 
DBDEMOS里的biolife表的Graphic字段不是Jpeg格式,而为BMP格式。
用jpegimage.loadfromstream 相当于用loadfromfile,因为stream记录的数据
格式跟文件格式是一样的,所以
memory:Tmemorystream里记录的数据是以bmp格式。所以你的方法相当于用jpegFImage打开一个*.bmp文件,当然会出错。
 
多人接受答案了。
 
后退
顶部