关于image.picture.bitmap.loadfromstream??? (50分)

  • 主题发起人 主题发起人 jbas
  • 开始时间 开始时间
J

jbas

Unregistered / Unconfirmed
GUEST, unregistred user!
下面是代码,但总是不能在image中显示图片?
但是image.savetofile('d:/s.bmp')却可以保存图片.
PResClass.ExtractRes()函数是返回一个tmemorystream.

procedure TForm1.Button3Click(Sender: TObject);
var
FeStream: TMemoryStream;
ResID:TResID;
begin
//FeStream:=TMemoryStream.Create;
FeStream:=PResClass.ExtractRes('d:/so.exe', 'd:/kk.ini', SectionPic,ResID);
// FeStream.LoadFromStream(PResClass.ExtractRes('d:/so.exe', 'd:/kk.ini', SectionPic,ResID));
showmessage('yes');
//festream.SaveToFile('d:/kkkk.bmp');
Image1.Picture.Bitmap.LoadFromStream(FeStream);
FeStream.Free;
end;
////但我多加了一个memorystream,却行了,why?
procedure TForm1.Button3Click(Sender: TObject);
var
FeStream, TempStream: TMemoryStream;
ResID: TResID;
begin
FeStream := TMemoryStream.Create;
TempStream := PResClass.ExtractRes('d:/so.exe', 'd:/kk.ini', SectionPic,
ResID);
FeStream.LoadFromStream(TempStream);
showmessage('yes');
Image1.Picture.Bitmap.LoadFromStream(FeStream);
FeStream.Free;
TempStream.Free;
end;
 
这是Delphi的BUG,在D5,D6,BCB5,BCB6均存在此问题,只能将流写入文件,再从文件中读出
 
我以前试过,没问题的:
看看如下说明:
下面的这段代码是在按了“查看图像”按钮之后所触发的事件处理程序:
procedure TForm1.Button1Click(Sender: TObject);
var tempstream:TStringStream;
  tempjpeg:TJPEGImage;
begin
  try
    tempstream:=TStringStream.Create('');
    TBlobField(Query1.FieldByName('Image')).SaveToStream(tempstream);
    tempstream.Position:=0;
    tempjpeg:=TJPEGImage.Create;
    tempjpeg.LoadFromStream(tempstream);
    DBImage1.Picture.Bitmap.Assign(tempjpeg);
 finally
    tempstream.Free;
    tempjpeg.Free;
 end;
end;
这段代码的主要作用是:首先将查询结果中的JPEG图像格式数据保存到TStringStream中去,然后设置数据指针在TStringStream中的位置为0;接着从TStringStream中读入相关数据,并把它们赋给TDBImage.Picture.Bitmap,这样一来就实现了将数据库中所存储的JPEG格式的数据转化为BMP格式,并在TDBImage中将图像显示出来。最后将TStringStream和TJPEGImage这两个对象释放掉。特别要注意的是不能在设计阶段设置TDBImage的DataField属性,而只能通过写代码的形式在运行阶段把利用流式数据所转化过来的新格式的图像数据赋给TDBImage.Picture.Bitmap。


 
后退
顶部