用tjpegimage操作数据库中的image字段出错(50分)

  • 主题发起人 主题发起人 smth
  • 开始时间 开始时间
S

smth

Unregistered / Unconfirmed
GUEST, unregistred user!
使用delphi4+mssql7.0,不知为何下面程序会出错,
初来乍到,请不要嫌分数太少.

try
Stream1 := Table1.CreateBlobStream(Table1.FieldByName('pic'),bmRead);

JpgImg.LoadFromStream(stream1);
//上面这行程序会出access violation错误
//但stream1读出的size是对的.

label1.caption := inttostr(Stream1.size) ;
finally
Stream1.Free;
end;
 
把你的整个函数贴出来把.
 
找到毛病了, 我原来是把jpgimg放在formcreate中create的,
现在改为在这个函数中 create一下就好了, 为什么呢?真是奇怪,
另外, 我如何把jpgimg中读到的图形放到一个image中显示呢?
有没有简单的方法? 谢谢指教
 
最简单?
image1.picture.assign(jpgimg);
 
哎呀,还是没有解决,请看:

procedure TForm1.Table1AfterScroll(DataSet: TDataSet);
var
blobstream : TMemoryStream ;

begin

Blobstream := TMemorystream.Create ;
jpgimg := TjpegImage.create;
try
TblobField(Table1.FieldByname('pic')).savetostream(Blobstream);

Statusbar1.panels[2].text := 'size:'+inttostr(Blobstream.size);
Blobstream.SaveToFile('f:/test.jpg'); // 此句执行后确实生
//成test.jpg

jpgimg.LoadFromStream(Blobstream); //但这句没有效果
jpgimg.SaveToFile('f:/test1.jpg'); // test1.jpg字节为0
// canvas.draw(100,10,Jpgimg);

finally
Blobstream.free ;
jpgimg.free ;
end;
end;

 
改成这样就对了,我是想显示数据库中存储的jpg图象,不知道有没有
更好的方法. 还有,虽然这样改对了,但我还是不知其所以然,请哪位
能给我详细讲讲, 非常感谢!

procedure TForm1.Table1AfterScroll(DataSet: TDataSet);
var
blobstream : TStream ;
begin
Blobstream := TBlobstream.Create(Table1.Fieldbyname('pic') as Tblobfield, bmread) ;
jpgimg := TjpegImage.create;
try
Statusbar1.panels[2].text := 'size:'+inttostr(TBlobstream(Blobstream).size);

jpgimg.LoadFromStream(Blobstream);
Image1.picture.graphic.Assign(Jpgimg);
finally
Blobstream.free ;
jpgimg.free ;
end;
 
又有问题:
procedure TForm1.Table1AfterScroll(DataSet: TDataSet);
var
blobstream : TStream ;
begin
Blobstream := TBlobstream.Create(Table1.Fieldbyname('pic') as Tblobfield, bmread) ;
jpgimg := TjpegImage.create;
try
Statusbar1.panels[2].text := 'size:'+inttostr(TBlobstream(Blobstream).size);

jpgimg.LoadFromStream(Blobstream);
Image1.picture.graphic.Assign(Jpgimg);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^//这样写有时会出现 access vioation 改成image1.picture.assign(jpgimg)就没问题了,请问这两者之间
有什么区别??

finally
Blobstream.free ;
jpgimg.free ;
end;
 
var
jpg:TJPEGImage;
x:TMemoryStream;
begin
jpg:=TJPEGImage.Create;
x:=TMemoryStream.Create;
TBlobField(table1.FieldByName('pic')).SaveToStream(x);
jpg.LoadFromStream(x);
jpg.SaveToFile('f:/test2.jpg');
image1.picture.assign(jpgimg);
x.free;
jpgimg.free;

1000% ok!

 
cytown :
真的不行, 我试了无数遍,而且还有个 jpeg #41号错误出来了.
把 image1.picture.assign(jpgimg)去掉没有错了, 但是
jpg.SaveToFile('f:/test2.jpg'); 执行完确实生成的jpg文件
长度为0,而 x.SaveToFile('f:/test.jpg') 则可以生成正确的
jpg文件; 麻烦你再试试.

我的系统: win98 + delphi 4 update3 ,连接nt上的sql 7
 
唉, 确实有问题:-(
这样就没问题了:
var
jpg:TJPEGImage;
begin
jpg:=TJPEGImage.Create;
TBlobField(table1.FieldByName('pic')).SaveToFile('temp');
jpg.LoadFromFile('temp');
jpg.SaveToFile('f:/test2.jpg');
image1.picture.assign(jpgimg);
jpgimg.free

个人认为是个BUG.
 
接受答案了.
 
晕倒, 分数加错了, 该给cytown ,CJ, 李颖 , 能麻烦改一下嘛?
 
晕倒, 分数加错了, 该给cytown ,CJ, 李颖 , 能麻烦改一下嘛?
 
哦! 才发现这个.
我可以退给你. 见贴子138311 :-)
 
后退
顶部