如何保存ACCESS的图片字段以及如何读取,我找过以前的贴子,结果都不行,特请教 如何保存ACCESS的图片字段以及如何读取 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 采用流的方法比较好,这个是我以前问的问题,你看看http://expert.csdn.net/Expert/topic/924/924211.xml?temp=.4580652 试试下面的方法,转贴:procedure TFormReportDef.BitBtn2Click(Sender: TObject);var OLEStream: TFileStream;begin if OpenDialog1.FileName <> '' then begin OleContainer1.Close; OLEStream := TFileStream.Create(OpenDialog1.FileName, fmOpenRead); ADODataSet1.Insert; ADODataSet1['Name'] := Edit1.Text; ADODataSet1['Memo'] := Memo1.Text; (ADODataSet1.FieldByName('TemplateFormat') as TBlobField).LoadFromStream(OLEStream); ADODataSet1['Ext'] := RightStr(OpenDialog1.FileName, 3); ADODataSet1.Post; FreeAndNil(OleStream); end;end;procedure TFormReportDef.BitBtn4Click(Sender: TObject);var sFileName: string; OLEStream: TMemoryStream;begin sFileName := ExtractFilePath(Application.ExeName) + 'tempBlob' + '.' + RightStr(ADODataSet1.FieldByName('Ext').AsString, 3); OLEStream := TMemoryStream.Create; OLEStream.LoadFromStream(ADODataSet1.CreateBlobStream(ADODataSet1.FieldByName('TemplateFormat'), bmRead)); OLEStream.SaveToFile(sFileName); OleContainer1.CreateObjectFromFile(sFileName, false);end;数据库是sql server 2000,blob字段类型是image,不能是textaccess 是 OLE 类型。 一、 原理介绍——流式数据的类型及其应用在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;beginMyJPEG := 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。 上面的方法是:TOMWLD (笑天) 的。相关帖子:http://expert.csdn.net/Expert/topic/1508/1508399.xml?temp=.7484247 例子:http://218.56.11.178:8020/web/index.aspx->下载基地->控件-数据库/报表->数据库图片存储 用 dbimage 设置datasource -> 和 field( 字段类型一定设置为ole类型)varAFormat:Word;AData:THandle;APalette:HPALETTE;begin if(OpenDialog1.Execute)then begin DBImage1.Picture.LoadFromFile(opendialog1.FileName); DBImage1.Picture.SaveToClipboardFormat(AFormat,AData,APalette); adoquery1.Edit; DBImage1.Picture.LoadFromClipboardFormat(AFormat,AData,APalette); dbimage1.Update; adoquery1.Post; end;end; 不建议在Access中存储图片,最好只是在其中保存图片的路径,很快棏 Delphi中如何调用SQL数据库的存储过程 哪位有INDY10的DEMO 请教如何制作带箭头的splitter,实现显示隐藏,如:DreamWeaver的各个面板的伸缩 money字段的数据该用什么类型的数据添加? 错误信息"Operation is not allow when the object is open"是什么原因引起的,该怎么解决? 紧急求救! 用Intraweb 如何控制Session数目 请大侠帮我看看这个问题! 谁有收邮件的第三方控件,急用!!! 关于Tedit光标问题 buddydeus进来接分 buddydeus进来接分
http://expert.csdn.net/Expert/topic/924/924211.xml?temp=.4580652
var
OLEStream: TFileStream;begin
if OpenDialog1.FileName <> '' then
begin
OleContainer1.Close;
OLEStream := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
ADODataSet1.Insert;
ADODataSet1['Name'] := Edit1.Text;
ADODataSet1['Memo'] := Memo1.Text;
(ADODataSet1.FieldByName('TemplateFormat') as
TBlobField).LoadFromStream(OLEStream);
ADODataSet1['Ext'] := RightStr(OpenDialog1.FileName, 3);
ADODataSet1.Post;
FreeAndNil(OleStream);
end;
end;
procedure TFormReportDef.BitBtn4Click(Sender: TObject);
var
sFileName: string;
OLEStream: TMemoryStream;
begin
sFileName := ExtractFilePath(Application.ExeName) + 'tempBlob' + '.' +
RightStr(ADODataSet1.FieldByName('Ext').AsString, 3);
OLEStream := TMemoryStream.Create;
OLEStream.LoadFromStream(ADODataSet1.CreateBlobStream(ADODataSet1.FieldByName('TemplateFormat'), bmRead));
OLEStream.SaveToFile(sFileName);
OleContainer1.CreateObjectFromFile(sFileName, false);
end;数据库是sql server 2000,blob字段类型是image,不能是textaccess 是 OLE 类型。
在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。
相关帖子:
http://expert.csdn.net/Expert/topic/1508/1508399.xml?temp=.7484247
http://218.56.11.178:8020/web/index.aspx
->下载基地->控件-数据库/报表->数据库图片存储
var
AFormat:Word;
AData:THandle;
APalette:HPALETTE;
begin
if(OpenDialog1.Execute)then
begin
DBImage1.Picture.LoadFromFile(opendialog1.FileName);
DBImage1.Picture.SaveToClipboardFormat(AFormat,AData,APalette);
adoquery1.Edit;
DBImage1.Picture.LoadFromClipboardFormat(AFormat,AData,APalette);
dbimage1.Update;
adoquery1.Post;
end;
end;
最好只是在其中保存图片的路径,很快棏