文档章节

TClientDataSet[6]: 读取 TClientDataSet 中的图片数据

涂孟超
 涂孟超
发布于 2014/09/26 15:36
字数 447
阅读 9
收藏 0

当我第一次从 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;

 
 
 
 
 

 

 

  

这是提取到的图片:


本文转载自:http://www.cnblogs.com/del/archive/2010/01/23/1654855.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
ClientDataSet探讨(1)-介绍

KeyLife富翁笔记 作者: hongxingdl 标题: ClientDataSet探讨(1)-介绍 关键字: midas 分类: 开发经验 密级: 公开 与TTable、TQuery一样,TClientDataSet也是从TDataSet继承下来的,...

天地弦
2004/08/06
0
0
TClientDataSet使用(二)

转自:http://hi.baidu.com/zwl232/blog/item/76f011dfc9543812622798f2.html TClientDataSet    与TTable、TQuery一样,TClientDataSet也是从TDataSet继承下来的,它通常用于多层体系结构的......

天地弦
2007/06/01
0
0
java将blob数据写入到xml中,Delphi TClientDataSet 读取blob失败

我用java把mysql数据写入到xml中,delphi TClientDataSet读取xml展示数据,数值、文本类型都能正常显示;blob类型异常 这里的原因应该是java将blob数据写入到xml中,delphi不认,请大神指点,...

liutao7514
2014/10/13
162
0
一个ClientDataset的Delta与XML相互转换

一个ClientDataset的Delta与XML相互转换的文章: 大家都知道TClientDataSet的Delta属性保存数据集的变化,但是Delta是OleVariant类型的属性,这样如果用Delphi写Webservice,就有需要把它转成...

vga
2014/02/27
0
18
Android开发数据库三层应用-DataSnap

Android开发数据库三层应用-DataSnap 时间:2013-10-24 13:41:54 点击:4988   核心提示:我觉得Delphi最强大的的功能之一就是开发数据库三层应用的DataSnap,在Android上的实现,首先是完...

vga
2014/06/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

linux 系统的运行级别

运行级别 运行级别 | 含义 0 关机 1 单用户模式,可以想象为windows 的安全模式,主要用于修复系统 2 不完全的命令模式,不含NFS服务 3 完全的命令行模式,就是标准的字符界面 4 系统保留 5 ...

Linux学习笔记
今天
2
0
学习设计模式——命令模式

任何模式的出现,都是为了解决一些特定的场景的耦合问题,以达到对修改封闭,对扩展开放的效果。命令模式也不例外: 命令模式是为了解决命令的请求者和命令的实现者之间的耦合关系。 解决了这...

江左煤郎
今天
3
0
字典树收集(非线程安全,后续做线程安全改进)

将500W个单词放进一个数据结构进行存储,然后进行快速比对,判断一个单词是不是这个500W单词之中的;来了一个单词前缀,给出500w个单词中有多少个单词是该前缀. 1、这个需求首先需要设计好数据结...

算法之名
昨天
14
0
GRASP设计模式

此文参考了这篇博客,建议读者阅读原文。 面向对象(Object-Oriented,OO)是当下软件开发的主流方法。在OO分析与设计中,我们首先从问题领域中抽象出领域模型,在领域模型中以适当的粒度归纳...

克虏伯
昨天
1
0
Coding and Paper Letter(四十)

资源整理。 1 Coding: 1.Tomislav Hengl撰写的非官方作者指南:Michael Gould•Wouter Gerritsma。 UnofficialGuide4Authors 2.R语言包rwrfhydro,社区贡献的工具箱,用于管理,分析和可视化...

胖胖雕
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部