文档章节

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
一个ClientDataset的Delta与XML相互转换

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

vga
2014/02/27
0
18
java将blob数据写入到xml中,Delphi TClientDataSet 读取blob失败

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

liutao7514
2014/10/13
190
0
Android开发数据库三层应用-DataSnap

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

vga
2014/06/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Confluence 6 自定义你的空间

通过对你的空间进行界面的自定义能够让你的空间更加出类拔萃。 如果你具有空间管理员权限,你可以修改你空间的颜色配色,添加你自己的空间标识,选择是否在你空间中显示边栏。或者你可以进入...

honeymose
29分钟前
1
0
Ubuntu18.04 安装MySQL

1.安装MySQL sudo apt-get install mysql-server 2.配置MySQL sudo mysql_secure_installation 3.设置MySQL非root用户 设置原因:配置过程为系统root权限,在构建MySQL连接时出现错误:ERROR...

AI_SKI
今天
3
0
3.6 rc脚本(start方法) 3.7 rc脚本(stop和status方法) 3.8 rc脚本(以daemon方式启动)

3.6-3.7 rc脚本(start、stop和status方法) #!/usr/bin/env python# -*- coding: utf-8 -*-# [@Version](https://my.oschina.net/u/931210) : python 2.7# [@Time](https://my.oschina.......

隐匿的蚂蚁
今天
3
0
Cnn学习相关博客

CNN卷积神经网络原理讲解+图片识别应用(附源码) 笨方法学习CNN图像识别系列 深度学习图像识别项目(中):Keras和卷积神经网络(CNN) 卷积神经网络模型部署到移动设备 使用CNN神经网络进行...

-九天-
昨天
5
0
flutter 底部输入框 聊天输入框 Flexible

想在页面底部放个输入框,结果键盘一直遮住了,原来是布局问题 Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("评论"), ...

大灰狼wow
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部