You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将IPicture保存到TStream并在TImage中显示?

解决IPicture转TStream并在TImage显示的问题

你的代码核心问题

  • 调用LOleG.SaveToStream(LStream)后,流的Position停在末尾,后续加载时未重置到起始位置,导致读取不到有效数据
  • SomeTImage.LoadFromFile仅支持文件路径参数,不能直接传入TStream对象,需改用LoadFromStream

修正后的实现代码

方式一:基于TOleGraphic处理

var
  LPicture: IPicture;
  LStream: TBytesStream;
  LOleG: TOleGraphic;
begin
  // 获取目标IPicture对象
  LPicture := DPBiometria.DPSC.ConvertToPicture(pSample) as IPicture;

  LStream := TBytesStream.Create;
  try
    LOleG := TOleGraphic.Create;
    try
      LOleG.Picture := LPicture;
      // 将图像写入流
      LOleG.SaveToStream(LStream);
      // 关键:重置流指针到起始位置
      LStream.Position := 0;

      // 直接加载到TImage显示
      SomeTImage.Picture.LoadFromStream(LStream);

      // 可选:转Bitmap保存到文件(需再次重置流位置)
      LStream.Position := 0;
      var Lbmp := TBitmap.Create;
      try
        Lbmp.LoadFromStream(LStream);
        Lbmp.SaveToFile('D:\testeStream.bmp');
      finally
        Lbmp.Free;
      end;
    finally
      LOleG.Free;
    end;
  finally
    LStream.Free;
  end;
end;

方式二:用TPicture直接包装IPicture(更简洁)

var
  LPicture: IPicture;
  LStream: TBytesStream;
  LTempPic: TPicture;
begin
  LPicture := DPBiometria.DPSC.ConvertToPicture(pSample) as IPicture;

  LStream := TBytesStream.Create;
  try
    LTempPic := TPicture.Create;
    try
      // 将IPicture转换为TPicture可识别的Graphic
      LTempPic.Graphic := TOleGraphic.CreateFromPicture(LPicture);
      // 保存到流
      LTempPic.SaveToStream(LStream);
      LStream.Position := 0;

      // 加载到TImage显示
      SomeTImage.Picture.LoadFromStream(LStream);
    finally
      LTempPic.Free;
    end;
  finally
    LStream.Free;
  end;
end;

额外提示

  • 如果需要强制指定输出格式(如PNG/JPG),可先将IPicture转换为对应格式的Graphic对象(TJPEGImage/TPNGImage)后再写入流,避免格式自动转换
  • 确保所有流和对象都通过try...finally正确释放,防止内存泄漏

内容的提问来源于stack exchange,提问作者jcaique

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 01:57:43