如何在数据库中直接存储图片(50分)

  • 主题发起人 主题发起人 树熊132
  • 开始时间 开始时间

树熊132

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大侠!!!!!!!!!救救小男子呀!!!!!
 
以16进制流存储!
 
圖片放在數據庫里不怎麼好,應該數據庫只放一個圖片的路徑,
然後在用loadformfile('c:/temp.bmp')讀出來
 
//调入图片

procedure TForm1.Button2Click(Sender: TObject);
begin
try
// OpenPictureDialog1.Filter := 'BMP files (*.bmp)|*.BMP|JPG files (*.jpg,*.jpeg)|*.JPG';
if OpenPictureDialog1.Execute then
Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
except
showmessage('图片调入错误!');
abort;
end;
end;

//保存
procedure TForm1.Button1Click(Sender: TObject);
var
MyJPEG : TJPEGImage;
MS: TMemoryStream;
begin
MyJPEG := TJPEGImage.Create;
try
IF Image1.Picture.Graphic<>NIL THEN
with MyJPEG do
begin
Assign(Image1.Picture.Graphic);
MS:=TMemoryStream.create;
SaveToStream(MS);
MS.Position:=0;
ADOTable1.Open;
ADOTable1.Append;
ADOTable1.FieldbyName('p_no').asstring:=edit1.Text;
ADOTable1.FieldbyName('p_na').asstring:=edit2.Text;
TBlobField(ADOTable1.FieldbyName('photos')).LoadFromStream(MS);
ADOTable1.Post;
// messagebox(getactivewindow(),'图像保存完毕!','保存',mb_ok);
end;
finally
MyJPEG.Free;
edit1.Text:='';
edit2.Text:='';
Image1.Picture:=nil;
end;
end;

//显示
procedure TForm1.Button3Click(Sender: TObject);
var tempstream:TStringStream;
tempjpeg:TJPEGImage;
begin
try
ADOQuery1.Open;
tempstream:=TStringStream.Create(' ');
TBlobField(ADOQuery1.FieldByName('photos')).SaveToStream(tempstream);
tempstream.Position:=0;
tempjpeg:=TJPEGImage.Create;
tempjpeg.LoadFromStream(tempstream);
Image1.Picture.Bitmap.Assign(tempjpeg);
finally
tempstream.Free;
tempjpeg.Free;
end;
end;
 
to pdb:那如果文件移走了或删除了那怎么办?
用流来做~!
如果你是用BDE连接的话,在TDatebase中把BLOB SIZE和BLOBS TO CACHE 改大点
你图片有多大,就设置的超过它,一般缺省的为32,也就是32k,如果你设置为4096那就
是4M!用流去添加!具体程序如下:
var
fs:TFileStream;
begin
if OpenDialogs1.Execute then
begin
fs:=TFileStream.Create(OpenDialogs.FileName,fmOpenRead);
Query1.Append;
TBlobField(Query1.FieldByName('picture')).LoadFromStream(fs);
fs.free;
Qurey1.Post;
end;
end;
注意,Query1的CachedUpdates的属性必须为False;RequestLive的属性必须为True;
你也可以用ADO连接!不要用ODBC连接!
我曾用以上程序保存了一个有2.25M的一个.bmp图片,没问题!保证通过!
 
如果我用来保存bmp图像呢?
 
我觉得用流是最好的,向后还有兼容行,任何文件格式都可以入库。。
 
如果是bmp图像可以直接用assign:
procedure TForm1.Button1Click(Sender: TObject);
var
picture1:tbitmap;
begin
picture1:=tbitmap.Create;
picture1.Assign(image1.Picture);
table1.FieldByName('照片').assign(picture1);
Picture1.free;
end;
 
TBlobField是什么,在哪里设置,我用的是odbc那怎么办?因为我用的是三层开发要用odbc
 
我要用来保存jpg图像。
 
要保存JPG到DATABASE去,可先将JPG 放到CLIPERBOARD,再用PAST FROM即可,不用写流。
而对BMP可直接ASSIGN,更不用流了,不过BPM太大,还是不用为好。
 
具体一点好吗?
 
以下是用SQL SERVER 7.0,delphi 5
procedure TUpdBaseFrm.DBImage1DblClick(Sender: TObject);
var
s:string;
begin
if dtmd1.UpdPctQry.active then
if not (dtmd1.UpdPctQry.state in [ dsEdit, dsInsert ]) then
dtmd1.UpdPctQry.edit;
if opendialog1.Execute then
begin
s:=opendialog1.FileName;
dbimage1.picture.loadfromfile(s);
dbimage1.CutToClipboard;
dbimage1.PasteFromClipboard;
end;
end;
 
如果是三层的话:

中间层:adotable+datasetprovider

客户端:clientdataset
procedure TForm1.Button1Click(Sender: TObject);
var
picture1:tbitmap;
begin
picture1:=tbitmap.Create;
picture1.Assign(image1.Picture);
clientdataset1.edit;
clientdataset1.Fields[0].assign(picture1);
clientdataset1.post;
clientdataset1.applyupdates(0);
Picture1.free;
end;

 
delphi 我不懂,用Vb什么都不用干,它支持的。
 
现在有一个问题就是各位大哥所有讲的东东都很支持bmp,但不支持jpg或jpeg。
 
保存:
var
SImage: TADOBlobStream;
begin
if OpenDialog1.Execute then
begin
ADOTable1.Append;
ADOTable1.FieldByName('PhotoName').AsString := ExtractFileName(OpenDialog1.FileName);
SImage := TADOBlobStream.Create(TBlobField(ADOTable1.FieldByName('photo')), bmWrite);
SImage.LoadFromFile(OpenDialog1.Filename);
SImage.Free;
ADOTable1.Post;
end;
这里,管你是什么文件,jpg也罢,bmp也罢,都无所谓。

读的时候,假设是jpg文件。
var
jp:TJPEGImage;
SImage: TADOBlobStream;
sFileName:string;
begin
sFileName := ADOTable1.FieldByName('PhotoName').AsString;
sFileName := ExtractFilePath(sFileName) + 'test' + ExtractFileExt(sFilename);
SImage := TADOBlobStream.Create(TBlobField(ADOTable1.FieldByName('photo')), bmRead);
SImage.SaveToFile(sFileName);
SImage.Free;
jp := TJPEGImage.Create;
jp.LoadFromFile(sFileName);
Image1.Picture.Bitmap.Assign(jp);
DeleteFile(sFileName);

这里是用临时文件方式,用Stream也一样。


 
我的问题是“如何用SQL语句来实现在数据库中存取JPG图片或Memo信息?”
 
temp:='insert into YWLXDYB(YWXH,NAME,FAXNAME,SVOX,EVOX,SVOXFILE,EVOXFILE) values("'+edit1.text+'","'+edit2.text+'","'+edit3.text+'",:svox,:evox,"'+edit4.text+'","'+edit5.text+'")'
dm.Qwh.SQL.Text:=temp;
dm.Qwh.ParamByName('svox').LoadFromFile(edit4.text,ftBlob);
 
[:D][gold]咋和我做的一样吖
我都是的是interbase,我啥也没设置
加了2m的bmp图到数据库里都没事
不过现在我用tiff格式入库的,size <40k
嘿嘿
(newsgroup有个羊人做的也和我类似,不过他不敢向我那样
盗版收费控件,他就找了个zip压缩的控件 :))[/gold]
 
后退
顶部