分享
 
 
 

Delphi数据库编程教程(六)

王朝delphi·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

第四节 在BLOB中寻找JPEG的开端

OLE对象类型格式—思路三(OLE object type format - take three!)

现在所有我们需要做的是存储图片到磁盘(存为普通的二进制文件)并了解它里门的内容是什么。

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

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

ADOTable1Picture.SaveToFile('BlobImage.dat');

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

你相信吗?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!

现在谁会说编程没有趣味?

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

思路五!

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

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有