如何将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
相关产品推荐
相关产品推荐

