Access数据库怎么保存图片?(200分)

  • 主题发起人 主题发起人 tripleh
  • 开始时间 开始时间
T

tripleh

Unregistered / Unconfirmed
GUEST, unregistred user!
我怎么把Image中显示的图片保存到Access数据库中去?最好有演示代码!
 
这个问题 好象不用200分吧 
搜索一下以前的资料就可以了 
祝 好运 
 
var
Jpg: TJpegImage;
ImageStream: TMemoryStream;
begin
ImageStream := TMemoryStream.Create;
Jpg := TJpegImage.Create;

Insert;
Jpg.Assign(Image1.Picture.Graphic);
Jpg.CompressionQuality := 60;
Jpg.SaveToStream(ImageStream);
ImageStream.Seek(0, 0);
TBlobField(FieldByName('ContPic')).LoadFromStream(ImageStream);
post;
end;
 
按二进制保存,代码参考楼上。
 
procedure savepicture;
var
BS:TADOBlobStream;
begin
Query1.Edit;
BS:=TADOBlobStream.Create(TMemoField(Query1.fieldbyname('图片')),bmWrite);
Image1.Picture.Graphic.SaveToStream(BS);
BS.Free;
Query1.Post;
end;
取:
procedure disppicture;
var
BS:TADOBlobStream;
begin
with datam.DataM1,input_Form do
begin
if Query2.fieldbyname('图片').IsNull then
begin
Image1.Picture.Graphic:=nil;
Exit;
end;
BS:=TADOBlobStream.Create(TMemoField(Query2.fieldbyname('图片')),bmRead);
BS.Free;
end;
end;
 
用内存流可以
 
同意楼上
 
不懂,所以关注一下。学习。
 
樓上這裡是我最近借鑒的例子,請可參考下:
这里是利用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。

使用ADO连接
1.保存
TBlobField(ADOQuery1.FieldName('blob')).Loadfromfile('文件名')
提取
TBlobField(ADOQuery1.FieldName('blob')).Savetofile('文件名')
2.
保存
(ADOQuery1.FieldByName('blob') as TBlobField).Loadfromfile('文件名')
提取
(ADOQuery1.FieldByName('blob') as TBlobField).Savetofile('文件名')

====================================
====================================

uses jpeg;
保存Image1中的图象至数据库 :
var
Ms:TmemoryStream;
jpg:Tjpegimage;
begin
ms:=TmemoryStream.Create;
Jpg.Assign(Image1.Picture.Graphic);
Jpg.SaveToStream(Ms) ;
Ms.Position :=0;
ADOquery1.append;
TBlobField(ADOquery1.FieldByName('img')).LoadFromStream(Ms);
ADOquery1.Post;
Ms.Free ;
jpg.free;
end;
从数据库中读取图象到image2中:
Var
Ms:TStringStream;
jpg:Tjpegimage;
begin
Ms:=TstringStream.Create('');
TBlobField(ADOquery1.FieldByName('img')).SaveToStream(Ms);
Ms.Position :=0;
Jpg.LoadFromStream(Ms);
Image2.Picture.Assign(Jpg);
Ms.Free;
jpg.free;
end;

例子2:

procedure TForm1.Button1Click(Sender: TObject); //插入圖片過程
var
testStream:TMemoryStream;
begin
try
testStream := TMemoryStream.Create; //創建內存流
Image1.Picture.Graphic.SaveToStream(testStream);  //將圖片保存至內存流中
adoquery1.Close;
adoquery1.SQL.Clear;
adoQuery1.SQL.Add('Insert into test (id,photo) values (:id,:photo)'); //進行插入操作
adoquery1.Parameters.ParamByName('id').Value := '003';
adoQuery1.Parameters.ParamByName('photo').LoadFromStream(testStream,ftBlob); //讀取保存的內存圖
adoquery1.ExecSQL;
finally
testStream.Free;   //釋放內存流
end;
end;

procedure TForm1.Button2Click(Sender: TObject); //讀取圖片過程
var
mStream:TMemoryStream;
JpgFile:TjpegImage;
begin
if not ADOQuery1.FieldByName('photo').IsNull then begin ;
mStream:=TMemoryStream.Create ;
JpgFile:=TjpegImage.Create ;
TBlobField(ADOQuery1.FieldByName('photo')).SaveToStream(mStream);  //顯示的轉換為BlobFiled並保存至內存流
mStream.Position :=0;
jpgfile.LoadFromStream(MStream);
image2.Picture.Assign(JpgFile);
end
else begin
image2.Picture :=nil;
end;
end;
 
谢谢大家。我试试,我是新手。今天结贴
 
楼上几位已经给出了代码,你修改一下就可以了...
 
我的Access数据库里字段类型为OLE。里面保存了一张BMP格式的图片。用楼上的办法取不出来!。我是这样做的

procedure TMainForm.zdqClick(Sender: TObject);
var
tempstream: TMemoryStream;
bmp:TBitmap;
begin
try
tempstream:=TMemoryStream.Create;
TBlobField(ADOQuery_EP.FieldByName('E_Image')).SaveToStream(tempstream);
tempstream.Position:=0;
Bmp:=TBitmap.Create;
BMP.LoadFromStream(tempstream);
EPArchivesForm.Image1.Picture.Bitmap.Assign(BMP);
finally
tempstream.Free;
BMP.Free;
end;
end;

取的时候提示Bitmap image is not valid
 
将图像保存到数据库中不是一个明致的做法
应该在数据库只做路径索引
图版文件以文件方式存在硬盘上就行了
 
后退
顶部