将图像直接插入数据库!-->在线等待,今晚结贴。
我现在需要将多种格式的图像文件(*.bmp,*.Jpg,*.TIFF)直接插入到SQL SERVER的数据库当中,test表的数据库字段是这样的:
id char
pic image
我做了一个简单的Query1,主要代码是:
Query1.sql.add('insert into test(id,pic) value(:id,:pic)');
Query1.ParamByname('id').Asstring:='1';
Query1.ParamByname('pic').LoadFromFile('d:\1.bmp',ftBlob);
Query1.ExecSql;
这样我的数据的确更新上去了,图片也上去,但有个问题:
我较小的图片,20k以下的基本正常 ,大于20k后就会出问题.
我用的TDBImage来显示,大于20k的图下显示出来上部会出现一片黑色的块,若是上传的JPG就根本显示不出来了。
请问各位高手,有没有其它方法来上传和显示呢?我的图片不会超过1M。
是不是需要转换成什么位流方式呢?
我试过Tbitmap和Tgraphic都不怎么行得通,不知Timage可以否?又该如何用呢》?
问题解决马上结贴.
问题点数:100、回复次数:15Top
1 楼lqdmafeng()回复于 2002-11-25 19:37:16 得分 10
你使使转成memorystream,我存WORD文档的时候转成流,读的时候,也使先存成流,然后再IMAGE.loadfromstream。使使,不行再说!哦棵!Top
2 楼hawksoft(明月清风)回复于 2002-11-25 19:43:35 得分 10
修改BDE的ODBC配置中的参数:
在Delphi 开发环境->Database->explore->你的ODBC->修改BLOB SIZE,BLOBS TO CACHE两个参数.
祝你好运.
Top
3 楼siyu2002(阿努比斯)回复于 2002-11-25 19:46:26 得分 0
参考一下
http://expert.csdn.net/Expert/topic/1204/1204374.xml?temp=.9548761Top
4 楼rockynmc(rockynmc)回复于 2002-11-25 21:36:02 得分 0
不行
还有没有其它高招。
我现在的问题是写进去的内容读出来时,小的BMP没问题,大的不行。
这图形应转换成什么流方式来表达呢?Top
5 楼older(井底蛙同样可以向往大海)回复于 2002-11-25 21:46:50 得分 10
你这样试一试
stringstream1 := TStringStream.create(nil);
img.savetostream(stringstream1);
Query1.sql.add('insert into test(id,pic) value(:id,:pic)');
Query1.ParamByname('id').Asstring:='1';
query1.paramByName('pic').asblob := stringstream1.datastring;
query1.executesql;
stringstream1.free;
img是一个支持显示图像的image控件Top
6 楼devil(通吃)回复于 2002-11-26 09:34:22 得分 20
给你一个Table存图片的参考
以下是我觉得在所有图片存取方法中最简单的方法
use jpeg,Clipbrd、、、、、、、、、、、、、
//Save to database
Image1.Picture.LoadFromFile('FileName');
if not (Image1.Picture.Graphic Is TBitmap) then
begin
ClipBoard.Assign(Image1.Picture);
Image1.Picture.Bitmap.Assign(ClipBroad);
ClipBoard.Clear;
end;//Change the picture that's not belonged to .bmp to .bmp
// picture
Table1.Edit;
Table1.FieldByName('Image').Assign(Image1.Picture);
Table1.Post;
//get from database
Image1.Picture.Bitmap.Assign(TPicture(Table1.FieldByName('Image')));Top
7 楼zfmich()回复于 2002-11-26 09:40:06 得分 0
用TBLOBFIELDTop
8 楼lyhold(让你飞)回复于 2002-11-26 09:48:11 得分 0
adoquery1.Edit ;
Tblobfield(adoquery1.FieldByName('zp')).Assign(image1.Picture );
adoquery1.Post ;
Top
9 楼lyhold(让你飞)回复于 2002-11-26 09:51:15 得分 0
显示:
dbImage1.Picture.Bitmap.Assign(TBLOBField(adoquery1.Fields[0]));
Top
10 楼star_of_light(Supper Star)回复于 2002-11-26 10:40:15 得分 0
If OpenDialog1.Execute then //保存图形
begin
ADOQuery1.Edit;
TBlobField(ADOQuery1.FieldByName('Pic')).LoadFromFile(OpenDialog1.FileName);
ADOQuery1.Post;
end;Top
11 楼rockynmc(rockynmc)回复于 2002-12-07 19:38:26 得分 0
我的问题始终没有得到更好的解决,冒昧得很,哪位有高招,指点小弟一把
star_of_light(星星之光) 的用ADO不会有错,(同样的方法若用ODBC或者BDE都不行),但此方法只能用于保存BMP格式的图片,而没办法解决通用的其它格式,如JPG,GIF等,这样一来,造成数据库增大,影响网络传输。
有没有更好的办法来上传JPG等图形格式呢?Top
12 楼star_of_light(Supper Star)回复于 2002-12-07 20:52:13 得分 50
我前面介绍的方法我在SQL Server中保存过BMP,JPG图片和Word文档。下面是另一种方法:
Var
Fs:TFileStream;
begin
If OpenDialog1.Execute then
begin
Fs:=TFileStream.Create(OpenDialog1.FileName);
ADOQuery1.Edit;
TBlobField(ADOQuery1.FieldByName('Image')).LoadFromStream(Fs);
ADOQuery1.Post;
end;
end;Top
13 楼star_of_light(Supper Star)回复于 2002-12-07 21:01:56 得分 0
Var
Stream:TStream;
begin
If OpenDialog1.Execute then
begin
try
Stream:=Query1.CreateBlobStream(Query1.FieldByName('Image'),bmRead);
ADOQuery1.Edit;
TBlobField(Query1.FieldByName('Image')).LoadFromStream(Stream);
ADOQuery1.Post;
finally
Stream.Free;
end;
end;
end;
Top
14 楼nico_h(nico)回复于 2002-12-08 15:56:08 得分 0
rockynmc (rockynmc) ,我用你的方法,好像库并没有变大啊,你怎么发现图片存到库里了?star_of_light(星星之光) ,assign方法没有在dbimage里显示什么东西,是没存进库里呢?还是没取出?Top
15 楼rockynmc(rockynmc)回复于 2002-12-10 15:53:10 得分 0
ar_of_light(星星之光) ,你的第二种办法显示不对的呀!?Top




