文档章节

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

涂孟超
 涂孟超
发布于 2014/09/26 15:36
字数 447
阅读 8
收藏 0
点赞 0
评论 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;

 
 
 
 
 

 

 

  

这是提取到的图片:


© 著作权归作者所有

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

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

天地弦 ⋅ 2004/08/06 ⋅ 0

TClientDataSet使用(二)

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

天地弦 ⋅ 2007/06/01 ⋅ 0

java将blob数据写入到xml中,Delphi TClientDataSet 读取blob失败

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

liutao7514 ⋅ 2014/10/13 ⋅ 0

一个ClientDataset的Delta与XML相互转换

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

vga ⋅ 2014/02/27 ⋅ 18

Android开发数据库三层应用-DataSnap

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

vga ⋅ 2014/06/01 ⋅ 0

带有TClientDataSet的delphi应用程序在发布时应注意的问题

这两天,我把我做的拍卖的操作端发布给公司的同事试用,这些机器都没有安装过delphi环境,我的程序所有用到的组件及单元文件都是build在一块儿的,按理说就不需要其他什么文件来支持了。  本...

技术小胖子 ⋅ 2017/11/02 ⋅ 0

delphi 三层创建

所谓三层: (1) 客户端 (2) 服务器端 (3) 数据库 在数据访问时,使得客户端必须通过服务器来访问数据库。提高了系统的安全性。 在Delphi中可以使用Socket或者Dcom来连接他们相互间的通讯。如...

vga ⋅ 2014/11/25 ⋅ 0

ClientDataSet探讨(4)--提交与恢复

KeyLife富翁笔记 作者: hongxingdl 标题: ClientDataSet探讨(4)--提交与恢复 关键字: midas 分类: 开发经验 密级: 公开 提交更新过程: 首先,客户程序要调用ApplyUpdates函数向应...

天地弦 ⋅ 2004/08/06 ⋅ 0

JSon SuperObject 研究2:数据集与JSON对象互转

JSon SuperObject 研究2:数据集与JSON对象互转 JSON不能完全替代XML,但绝对是未来的大势所趋,其优点是简单、体积小、解析更快、解析占用资源更少。在delphi中,数据集是最常用数据存取方式...

vga ⋅ 2014/12/20 ⋅ 1

Delphi DataSnap 的使用

DataSnap 2009是从Delphi2009开始提供的新的DataSnap,对原有DataSnap大副改进,虽然保留了原来的基于COM的方式,但默认是使用新的不基于COM的方式,这使得它成为轻量级的、灵活的多层应用技...

vga ⋅ 2014/11/25 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Windows下安装运行phpMyAdmin

首先确保安装了phpMyAdmin,其次要求服务器是打开的。 如果是在Windows下,建议下载安装WampServer,这是一个集成软件,集成了Apache+MySQL+PHP的开发环境,而且也自带了phpMyAdmin这个软件。...

临江仙卜算子 ⋅ 9分钟前 ⋅ 0

jdk1.8 安装及环境变量配置

1.根据jdk 的软件安装包,首先安装,jdk,

kuchawyz ⋅ 9分钟前 ⋅ 0

给Java字节码加上”翅膀“的JIT编译器

给Java字节码加上”翅膀“的JIT编译器 上面文章在介绍Java的内存模型的时候,提到过由于编译器的优化会导致重排序的问题,其中一个比较重要的点地方就是关于JIT编译器的功能。JIT的英文单词是...

九劫散仙 ⋅ 10分钟前 ⋅ 0

PCI简介(二)

1.x86处理器系统地址空间简介 1.1 CPU地址空间 CPU地址空间是指CPU所能寻址的空间大小,比如对于32位CPU来说,其所能寻址的空间大小为0~4G。这是由CPU自身的地址总线数目决定的。这段空间也被...

深山野老 ⋅ 11分钟前 ⋅ 0

spring中的InitializingBean接口

好久没更博了,真有点怀念,前段时间刚和上家公司say bye,这次进的是电商公司,今天刚开始看代码,逻辑很复杂。 今天看的注册功能,里面见到一个知识点,现在记录一下,今天看项目时见到里面...

千元机爱好者 ⋅ 13分钟前 ⋅ 0

机器学习:数据预处理之独热编码(One-Hot)

前言 ———————————————————————————————————————— 在机器学习算法中,我们经常会遇到分类特征,例如:人的性别有男女,祖国有中国,美国,法国等。 ...

NateHuang ⋅ 21分钟前 ⋅ 0

MyBatis之输入与输出(resultType、resultMap)映射

在MyBatis中,我们通过parameterType完成输入映射(指将值映射到sql语句的占位符中,值的类型与dao层响应方法的参数类型一致),通过resultType完成输出映射(从数据库中输出,通过dao层的方法查...

瑟青豆 ⋅ 22分钟前 ⋅ 0

屏蔽运营商广告劫持

在今天早上我查找知乎时再次遇到了恶心的运营商广告劫持,右下角硕大的广告直接让知乎挂掉了,我刷了五次知乎才好,之前休息的时候逛知乎也是多次加载错误,估计也是这劫持的锅,相信各位也遇...

gcudwork ⋅ 25分钟前 ⋅ 0

java web 进度条实现原理

资料路径 https://blog.csdn.net/fengsheng5210/article/details/79305026

zaolonglei ⋅ 26分钟前 ⋅ 0

命令行输出java版本与环境变量配置的不一样问题解决

问题:java10刚出来,本着好奇的心,急切的装了体验一下,然后实际项目需求还是java8,所以体验完了就把环境变量改回来了,但是出现了一个问题,命令行输出java版本与环境变量配置的不一样,...

消散了的诗意 ⋅ 28分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部