0

我正在用delphi开发一个应用程序。我正在尝试提取保存在数据库中的图像,将其保存到TMemoryStream并加载相同的图像,并将其TImage放置在将动态填充的其他表单上的控件上。当我尝试将图像从流加载到放置在表单上的图像控件时,出现访问冲突错误。

错误描述如下

模块 abc.exe 中地址 00B548C 的访问冲突。读取地址 0000000

我的代码片段如下

UniConnection1.Connected := true;  
UniQuery2.SQL.Text := 'Select image from userplays where id = :id';
UniQuery2.Params.ParamByName('id').Value := idpub1;
UniQuery2.Open;
if UniQuery2.FieldByName('image').AsString <> '' then

begin       
   try
   Stream121 := TMemoryStream.Create;
   TBlobField(UniQuery2.FieldByName('image')).SaveToStream(Stream121);
   Stream121.Position := 0;
      if Assigned(Stream121) then
      begin
         Image1.Picture.Graphic.LoadFromStream(Stream121);
         Image1.Update;
      end;

    finally
      Stream121.Free;
    end;
end;
4

2 回答 2

5

TPicture无法确定流中的图形类型,所以你必须事先告诉它。如果您只有 JPEG 图像,则可以对其进行硬编码。否则,您也应该将图像格式存储在数据库中。

var
  graphic: TGraphic;  

Stream121.Position := 0;
if Stream121.size > 0 then begin
  graphic := TJPEGImage.Create;
  try
    graphic.LoadFromStream(Stream121);
    Image1.Picture.Graphic := graphic;
  finally
    graphic.Free;
  end;
end;
于 2016-06-29T13:46:58.857 回答
2

您指的是 Graphic.LoadfromStream。但 Graphic 可能不(可能不会)存在。您可以保存到文件并使用 Picture.LoadFromFile 代替(因为这将创建适当的 TGraphic 后代)或首先创建 Picture.Graphic 作为适当的类型(例如 TBitmap)。

Picture.Graphic := TBitMap.Create;

就目前而言,图像不知道您的数据采用什么图形格式。您需要以某种方式告诉它。

于 2016-06-29T13:55:34.300 回答