ACCESS中如何加入图片?(50分)

  • 主题发起人 主题发起人 无锡空心菜
  • 开始时间 开始时间

无锡空心菜

Unregistered / Unconfirmed
GUEST, unregistred user!
各位富翁,在下有一菜鸟问题,希望大家鼎力相助。
我的ACCESS表中需要一个存放图片的字段,以便用DELPHI的数据库图片控件显示出来,但是
我在ACCESS中却找不到能放图片的字段类型,不知道是不是用OLE,如果是那该怎么设置,如果不是
该怎么解决?
谢谢大家了
 
是的。
access中的ole相当于其它数据库中的image字段。
没有什么需要特别设置的。
 
可是我选了OLE以后,怎么把图片加进去呢?我把某个字段设置成OLE以后,总是打开画笔,
不能把已经有的图片加进去阿!
远帆兄能说详细点吗?
 
你是用程序打开还是在access中?
1、在access中:右键点击“插入对像”然后选文件。
2、在程序中,用文件流的方法readfromstream、savetostream或readfromfile、。。。
最简单的,用dbimage显示也可以。
 
我点击“插入对象”后,在出来的“对象类型”列表框中,选择图象文档或位图文档就会
打开一个画板,不能引入已经做好的图片。如果选择“由文件创建”,则加进去的图片不能
在DBIMAGE控件中显示,提示错误:“Bitmap images is not valid”。现在该怎么办啊?

另外,如果图片能加入,并且显示正常的话,那这个图片是存在数据库里面了呢,还是数据
库仅仅是存储了图片的相对位置?

谢谢!
 
我遇到过,我的是ACCESS97,是我的OFFICE安装不完整,关于OLE服务的文件损坏。
 
并不一定要用ole字段,可建一个字符型字段用来存储图像的地址
1,存储图像地址到Access
首先,加一个OpenDialog空间
在image1的ondblclick事件中写
procedure TForm.Image1DblClick(Sender: TObject);
var
Path: String;
begin
if OpenDialog1.Execute then
begin
Path := OpenDialog1.FileName;
try
Image1.Picture.LoadFromFile(Path);
DMForm.adoqry.Edit;
DMForm.adoqry['地址'] := Path;
DMForm.adoqry['地址'].Post;
except
ShowMessage('不是有效的文件');
end;
end;
end;
2。读取图片
在窗口的onshow事件或其他合适事件中写
if (DMForm.adoqry['地址'] <> '') or (DMForm.adoqry['地址']<>null) then
Image1.Picture.LoadFromFile(DMForm.adoqry['地址']);
 
to 美国提子:
我想把图片也放到数据库中,你说的方法只能显示,但图片并没有加到数据库中,况且
我这个程序中的图片很多,如果用你的方法,图片管理起来会很困难的。
不过还是要谢谢你的热情帮忙。
请各位再帮帮忙吧!
 
来自:caojun77, 时间:2001-4-29 17:10:00, ID:519237
如何实现在MS Access数据库中图像的存储和显示
一、 原理介绍——流式数据的类型及其应用
在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——Binary 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 tempstream:TStringStream;
tempjpeg:TJPEGImage;
begin
try
tempstream:=TStringStream.Create(' ');
TBlobField(Query1.FieldByName('Image')).SaveToStream(tempstream);
tempstream.Position:=0;
tempjpeg:=TJPEGImage.Create;
tempjpeg.LoadFromStream(tempstream);
DBImage1.Picture.Bitmap.Assign(tempjpeg);
finally
tempstream.Free;
tempjpeg.Free;
end;
end;
这段代码的主要作用是:首先将查询结果中的JPEG图像格式数据保存到TStringStream中去,然后设置数据指针在TStringStream中的位置为0;接着从TStringStream中读入相关数据,并把它们赋给TDBImage.Picture.Bitmap,这样一来就实现了将数据库中所存储的JPEG格式的数据转化为BMP格式,并在TDBImage中将图像显示出来。最后将TStringStream和TJPEGImage这两个对象释放掉。特别要注意的是不能在设计阶段设置TDBImage的DataField属性,而只能通过写代码的形式在运行阶段把利用流式数据所转化过来的新格式的图像数据赋给TDBImage.Picture.Bitmap。
 
to 美国提子:
万分感谢!你的方法应该没问题了,不过我还想问问其他的富翁们有没有其他的解决方法。
这50分全部给你了,还请笑纳。
我再加50分,希望能看到其他的解决方法。谢谢大家,特别是提子兄 :——)

顺便再问一下如何把这个问题的积分由50分改到100分
 
再次感谢提子兄!
发分了 :)
 
后退
顶部