求救解决“JPEG error #41”(100分)

  • 主题发起人 主题发起人 水兵
  • 开始时间 开始时间

水兵

Unregistered / Unconfirmed
GUEST, unregistred user!
我读出Paradox数据库中的jpg图形,开始一切正常,
但后来就出现“JPEG error #41”的错误。我的代码如下:
Table1->Open();
Table1->Edit();
TJPEGImage *j=new TJPEGImage();
TBlobStream *s;
s=new TBlobStream(dynamic_cast<TBlobField*>
(Table1->FieldByName("G")),bmRead);
j->LoadFromStream(s);
Image1->Picture->Assign(j);
delete j;
delete s;
用的是builder4,各位专家不要嫌弃。
 
跟踪一下,看哪里出错。
 
http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=259563
 
跟踪 jpeg.pas 看在哪里出错, 试着找出原因后解决。
如果实在解决不了,把 jpeg.pas 单元内的出错句子(rase...) 屏蔽掉
 
应该是格式不对吧,stream的头有一些stream的信息,image读入的时候认为不是一个jpeg
,所以报这个错。最好在显示图像这前用一下stream.Seek(0,soFromBeginning);
给你一个DELPHI的例子,你再把它改成BCB吧。
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;
 
你保证数据库里的图都为jpeg格式,如不是则会出错。

http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=261257
http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=260321
 
http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=264291
 
是数据的错误。
 
我任为是流的使用错误,因为当将数据从大二进制字段存到流中的时候,数据是从头
开始的,这样当结束的时候数据指针将指到流的尾部,如果不将指针移到开始,在读
出流的时候就会读到流后面的数据,尽管大小一样,但是流内部的数据结构显然已经
改变了,这就是为什么在用图象控件将流数据重新格式重整的时候会出现这个错误,
解决的方法就是在读出流的时候将指针重新定位到开头。

如:
s=new TBlobStream(dynamic_cast(Table1->FieldByName("G")),bmRead);
s.Seek(0,soFromBeginning);//将流数据指针移到开头
j->LoadFromStream(s); //读出
Image1->Picture->Assign(j);//格式重整
应该会没有问题了。
 
honghs 和only you 是对的。我也碰到同样问题。由于粗心忘了将stream的指针复位。可以
简单地写为 mystream.position ;= 0 。
 
这个讨论该结束了。贴帖子的主儿也不知哪去了。斑竹呢?分红吧。
 
同意BrainTwist,honghs 和only you的观点.关键就是指针的位置.Seek(0,soFromBeginning)
 
多人接受答案了。
 
后退
顶部