Delphi中怎么样才能将照片保存到ACCESS数据库里?

谢谢!不好意思,我想问下,提供的程式中的TJPEGImage好象没有这种数据类型啊,是什么意思啊?谢谢!... 谢谢!不好意思,我想问下,提供的程式中的TJPEGImage好象没有这种数据类型啊,是什么意思啊?谢谢! 展开
 我来答
yueyun889
2006-11-15 · TA获得超过725个赞
知道小有建树答主
回答量:539
采纳率:0%
帮助的人:766万
展开全部
在单元接口部分引用 jpge
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
快乐居家美食
2006-11-15 · TA获得超过1943个赞
知道大有可为答主
回答量:2392
采纳率:100%
帮助的人:1576万
展开全部
一、 原理介绍--流式数据的类型及其应用
在Dephi中提供了TStream来支持对流式数据的操作。TStream是万流之源。
但由于它是一个抽象类,故不能被直接使用;而要使用其相应的子类,
如:TFileStream 、TStringStream、TMemoryStream、TBlobStream、
TWinSocketStream和TOleStream。TStream提供了统一、简洁的方法来进行数据的读写。
1.)SaveToStream(Stream: TStream ); 作用:将类中的数据写到Stream的当前位置中
2.)LoadFromStream(Stream: TStream); 作用:从当前位置读入Stream里的数据
实际使用时我们基本上只要使用上面两个函数就可以了。

二、所遇到的问题及相应的解决方法
为了节省图像的存储空间和使用更加方便,决定采用JPEG这种图像格式。

(一)所遇到的问题

第一、在Delphi 5中进行画图所用到的组件是TImage,所生成的图像的格式为BMP格式,
而为了节省图像的存储空间,图像在数据库里存储的格式须为JPEG格式,这样就产生了
图像格式转化的需求;而TImage本身并不直接提供这两种图像格式之间的转化。

第二、怎样将存储在Microsoft Access数据库中的图像取出并且显示出来:在Delphi 5
中,能提供这种功能的组件是TDBImage,但该组件却存在着一个很大的缺陷:它所能显
示的图像类型只能是一些图标文件,元文件和BMP文件,而不能支持JPEG格式的图像在
该组件中的显示;但根据实际需要,在Microsoft Access数据库中所存储的图像数据却
是以JPEG格式保存的。

(二)相应的解决方法
为了解决上述两个问题,可以采用目前数据库中一种名为大二分对象(BLOB--Bina
ry Large Object),它是用来处理某些特殊格式的数据的。BLOB在数据库的表中实际上
是以二进制数据的形式存放的。为了处理BLOB字段,可以借鉴一些可视的桌面数据库的
方法。在这里,我们选择了通过内存流的方式来完成;使用内存流,可减少磁盘操作,
大大提高运行效率。
具体的过程和相关的程序代码如下:

1、如何实现在Microsoft Access数据库中的图像存储:
这里是利用TStream的子类TMemoryStream向Microsoft Access数据库中存储图像的。
下面的这段代码是在按了“保存”按钮之后所触发的事件处理程序:
procedure TForm1.Button1Click(Sender: TObject);
Var
MyJPEG : TJPEGImage;
MS: TMemoryStream;
Begin
MyJPEG := TJPEGImage.Create;
Try
With MyJPEG do
Begin
Assign(Image.Picture.Graphic);
MS:=TMemoryStream.create;
SaveToStream(MS);
MS.Position := 0;
Table1.Edit;
TBlobField(Table1.FieldbyName('Image')).LoadFromStream(MS);
Table1.Post;
Messagebox(Getactivewindow(), '图像保存完毕!', '保存', MB_OK);
End;
Finally
MyJPEG.Free;
End;
End;
在这段代码里TStream的子类TMemoryStream利用内存流起到了将BMP格式转化为JPEG格式
的中间桥梁的作用。

2、如何将图像从Microsoft Access数据库中取出并显示出来:
下面的这段代码是在按了“查看图像”按钮之后所触发的事件处理程序:
procedure TForm1.Button1Click(Sender: TObject);
Var
MyJPEG : TJPEGImage;
MS : TMemoryStream;
Begin
Try
MS := TMemoryStream.Create;
TBlobField(Query1.FieldByName('Image')).SaveToStream(MS);
MS.Position := 0;
MyJPEG := TJPEGImage.Create;
MyJPEG.LoadFromStream(MS);
DBImage1.Picture.Bitmap.Assign(MyJPEG);
//或是Sender.Picture.Assign(MyJPEG);
Finally
MS.Free;
MyJPEG.Free;
End;
End;
这段代码的主要作用是:首先将查询结果中的JPEG图像格式数据保存到TMemoryStream中去,
然后设置数据指针在TMemoryStream中的位置为0;接着从TMemoryStream中读入相关数据,
并把它们赋给TDBImage.Picture.Bitmap,这样一来就实现了将数据库中所存储的JPEG格式的
数据转化为BMP格式,并在TDBImage中将图像显示出来。最后将TMemoryStream和TJPEGImage
这两个对象释放掉。特别要注意的是不能在设计阶段设置TDBImage的DataField属性,而只能
通过写代码的形式在运行阶段把利用流式数据所转化过来的新格式的图像数据赋给TDBImage.Picture.Bitmap。

BTW:用到TBlobField的时候要在接口包含DB,用到TJPEGImage时要在接口包含Jpeg

最下面,看这儿,这儿有说明
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式