Delphi数据库编程教程(六)[1]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 eagletian 的 blog

 第四节  在blob中寻找jpeg的开端

      ole对象类型格式—思路三ole object type format - take three!)
      现在所有我们需要做的是存储图片到磁盘(存为普通的二进制文件)并了解它里门的内容是什么。

      所有的图片文件(格式)都有用来唯一的标识图像的文件头。jpg图片文件以所谓的soi标记开始,该标记的十六进制值是$ffd8。

下面一行代码存储图片字段值到工作目录的相关文件(blobimage.dat)。在表单的oncreate事件中放置这条代码,开始工程以后再移除该代码。

      adotable1picture.savetofile('blobimage.dat');

      一旦我们有了这个文件。我们就可以使用hex editor看它的内容。

jpeg as ole object binary file

      你相信吗?ms access把连接的ole对象的路径作为对象定义的一部分存储在ole对象字段中。因为ole对象的存储定义没有被文档化(!?这直接来自于ms),所以没有办法知道真正的图像数据被写之前能得到什么。

      分两个部分考虑这个问题。第一:我们需要找到'ffd8'并从那儿开始读取图像。第二:'ffd8'不可能总在文件的同一个位置。结论:我们需要一个函数,返回access数据库中存储为ole对象的jpg文件的soi标记的位置。

      正确的方法—思路四(the correct way - take four!)

      提供了blob类型字段后,我们的函数应返回adoblobstream中'ffd8'字符串的位置。readbuffer(读缓冲区)从流中一个字节一个字节的读取数据。对readbuffer的每个调用都会一个字节一个字节的移动流的位置。当两个字节一起引出soi标记时,函数返回流的位置。这是这个函数:

   function jpegstartsinblob(picfield:tblobfield):integer;
   var
    bs     : tadoblobstream;
    buffer : word;
    hx     : string;
   begin
    result := -1;
    bs := tadoblobstream.create(picfield, bmread);
    try
     while (result = -1) and (bs.position + 1 < bs.size) do
     begin
      bs.readbuffer(buffer, 1);
      hx:=inttohex(buffer, 2);
      if hx = 'ff' then begin
       bs.readbuffer(buffer, 1);
       hx:=inttohex(buffer, 2);
      if hx = 'd8' then result := bs.position - 2
       else if hx = 'ff' then
             bs.position := bs.position-1;

			  
本文关键:Picture fomats
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top