RSS
热门关键字:  数据挖掘  人工智能  数据仓库  搜索引擎  数据挖掘导论

Delphi数据库编程教程(六)

来源: 作者:unkonwn 时间:2005-08-12 点击:

 第四节  在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; 

数据挖掘研究院

      end; //if 数据挖掘研究院 
     end; //while 

数据挖掘研究院

     finally 

数据挖掘研究院

      bS.Free 数据挖掘实验室 
     end;  //try 数据挖掘研究院 
   end; 数据挖掘研究院 
   一旦我们有了SOI标记的位置,我们就能使用它在ADOBlob流中找到图片的位置。 

数据挖掘研究院

     uses jpeg; 数据挖掘实验室 
     ...  
     procedure TForm1.btnShowImageClick(Sender: TObject); 数据挖掘研究院 
     var 

数据挖掘研究院

      bS  : TADOBlobStream; 

数据挖掘实验室

      Pic : TJpegImage; 数据挖掘研究院 
     begin 数据挖掘实验室 
      bS := TADOBlobStream.Create(AdoTable1Picture, bmRead); 

数据挖掘研究院

      try 数据挖掘研究院 
       bS.Seek(JpegStartsInBlob(AdoTable1Picture),soFromBeginning); 

数据挖掘研究院

       Pic:=TJpegImage.Create; 数据挖掘研究院 
       try 数据挖掘研究院 
        Pic.LoadFromStream(bS); 数据挖掘研究院 
        ADOImage.Picture.Graphic:=Pic; 

数据挖掘研究院

       finally 数据挖掘实验室 
        Pic.Free; 数据挖掘研究院 
       end;  
      finally 

数据挖掘研究院

       bS.Free 数据挖掘研究院 
      end;  
     end; 数据挖掘研究院 
   运行工程,OK! 数据挖掘研究院 
JPG image from MS Access with ADO 数据挖掘研究院 
   现在谁会说编程没有趣味?  

      注:在真正的代码程序中,我们会在TDataSetAfterScroll事件中加入代码用于从当前行中读取和显示图像(它在ADOTable1AfterScroll事件过程中)。当应用程序从一个记录滚到另一个时,AfterScroll事件发生。 数据挖掘研究院

    思路五!

数据挖掘实验室

    这就是本章的主要内容。现在你可以存储和显示所有你感兴趣的JPG图片。在这篇文章的最后一页,我会提供完整的代码(form1单元);所有的数据安排都放在表单的OnCreate事件中。这确保了所有的三个组件被正确连接—在设计时你不需要使用Object Inspector(对象检视器)。

数据挖掘实验室

    我承认,这一章不适合初学者,但世界是残酷的!另一件事:你注意到最后你都不知道怎样改变(或增加一些新的)表中的图片!是的,那又是另一个完整的故事了!

最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
匿名?