当我第一次从 TClientDataSet 中读出图片数据时, 发现不是图片!
慢慢观察发现是前面多了 8 个字节(前 4 个字节是 01 00 00 01, 估计是格式标识和头大小; 后 4 个字节是后面图片文件的大小), 去掉这个 8 个字节就是图片文件了.
下面的例子先是检索了 20 个示例文件的所有图片字段, 并把其中的图片提取到指定文件夹;
还把一个指定字段中的图片显示在了窗体上.
//先在窗体上放 ClientDataSet1 和两个 Button uses IOUtils, Types; { 把示例文件中的所有图片提取到 C:\Temp\ } procedure TForm1.Button1Click(Sender: TObject); const DestPath = 'C:\Temp\'; var PathArr: TStringDynArray; Dir, Path: string; Field: TField; BmpName: string; begin { 获取范例文件列表 } Dir := GetEnvironmentVariable('CommonProgramFiles') + '\CodeGear Shared\Data\'; PathArr := TDirectory.GetFiles(Dir, '*.cds'); for Path in PathArr do { 分别处理每个文件 } begin ClientDataSet1.LoadFromFile(Path); for Field in ClientDataSet1.Fields do { 遍历每个字段 } begin Tag := 0; if (Field.DataType = ftGraphic) then { 如果是图片字段 } begin ClientDataSet1.First; while not ClientDataSet1.Eof do { 遍历每个记录 } begin if not Field.IsNull then { 如果字段不为空 } begin { 确定要保存的目录和文件名 } BmpName := TPath.GetFileNameWithoutExtension(Path); { 不带后缀的文件名 } BmpName := Format('%s%s_%.2d.bmp', [DestPath, BmpName, Tag]); Tag := Tag + 1; { 把图片数据提取到流, 删除前 8 个字节后保存 } with TBytesStream.Create(Field.AsBytes) do begin Move(Bytes[8], Bytes[0], Size - 8); SetSize(Size - 8); SaveToFile(BmpName); Free; end; end; ClientDataSet1.Next; end; end; end; end; end; { 把示范文件 biolife.xml 第一个记录中 Graphic 字段中的图片画在窗体上 } procedure TForm1.Button2Click(Sender: TObject); var Stream: TBytesStream; Bitmap: TBitmap; Path: string; begin Path := GetEnvironmentVariable('CommonProgramFiles') + '\CodeGear Shared\Data\biolife.xml'; ClientDataSet1.LoadFromFile(Path); Stream := TBytesStream.Create(ClientDataSet1.FieldByName('Graphic').AsBytes); Stream.Position := 8; Bitmap := TBitmap.Create; Bitmap.LoadFromStream(Stream); Canvas.Draw(10, 10, Bitmap); Bitmap.Free; Stream.Free; end;
这是提取到的图片:

分类:
数组相关
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
2009-01-23 Delphi 与 DirectX 之 DelphiX(89): TDIB.DrawAlphaMask();
2009-01-23 Delphi 与 DirectX 之 DelphiX(88): TDIB.DrawQuickAlpha();
2009-01-23 Delphi 与 DirectX 之 DelphiX(87): TDIB.DrawTransparent、DrawTranslucent、DrawAlpha();
2009-01-23 如何在 GDI+ 中指定旋转中心 - 回复 "wuheng66888" 的问题
2009-01-23 如何让 TGPImage 直接从流中加载图片? - 回复 "datouxuke " 的问题
2008-01-23 初学 Delphi 嵌入汇编[3] - 第一个 Delphi 与汇编的例子
2008-01-23 初学 Delphi 嵌入汇编[2] - 汇编语言关键字