先 uses jpeg var ImageBMP:Tbitmap; ImageJPEG:Tjpegimage; begin try if bsSkinOpenPictureDialog1.Execute then begin Data.dsProbation.DataSet.Edit; if uppercase(ExtractFileExt(bsSkinOpenPictureDialog1.FileName))='.JPG' then begin ImageBMP:=Tbitmap.Create; ImageJPEG:=TjpegImage.Create; ImageJPEG.LoadFromFile(bsSkinOpenPictureDialog1.FileName); ImageBMP.Assign(ImageJPEG); ImageBMP.SaveToFile(ExtractFilePath(application.ExeName)+'TempBMP.BMP'); //bsSkinDBImage1.Picture.LoadFromFile(bsSkinOpenPictureDialog1.FileName);// bsSkinDBImage1.Picture.LoadFromFile(ExtractFilePath(application.ExeName)+'TempBMP.BMP'); end else bsSkinDBImage1.Picture.LoadFromFile(bsSkinOpenPictureDialog1.FileName); end; except unit1.frm_mian.bsSkinMessage1.MessageDlg('您选择的图片格式有误,请从新选择!', mtInformation, [mbOK], 0); exit; end; end; 不知道是我用的控件问题还是DELPHI的BUG ,DBImage1不能正常显示JPG的图片,所以要把JPG的转成BMP的,如果在放入数据库,这样唯一不好的就是BMP的图太大了,影响数据库的质量!
1.创建一个含有Graphic字段的数据库列表。
在WindowsISQ(或Databasedesktop)下create database mydb.gdb
create table myfrieds
(name varchar(15) notnull,
telephone varchar(12),
address varchar(30),
zipvarchar(8),
picture varchar(15),
image blob); 其中,picture字段用于保存图像的名称(包括路径),image(Graphic字符)则用于存储图像,其数据类型
为“blob”。 2.建立窗体(如图1所示),设置窗体中各控件的属性。 该窗体的主要功能是将某人信息进行编辑和保存。需要注意的图像保存所用的图像框必须用TImage而不能用TDBImage,编辑框宜用Tedit而不宜用TDBEdit,这一点与图像的读取恰好相反。 其中,各主要控件的属性设置如下:
Datasource1.Dataset:=table1;
Table1.Databasename:=mydb.gdb;
Table1.Tablename:=myfriends;
Table1.active:=true;
其他诸如Caption之类的属性设置不再叙述。 3.数据处理程序的建立。
(1)图像( .bmp文件)打开的处理。
procedureTForm1.pictopenbtnClick(Sender:TObject);
begin
opendialog1.execute;
image1.picture.loadfromfile(opendialog1.filename);
end; (2)图像保存的处理。
图像保存的处理程序完成把在窗体1所编辑的信息包括图像保存到相应的数据库中,其关键是要定义一个Graphic类型的变量且该变量要用Assign()函数传递到相应数据库中保存。具体程序如下:
procedureTform1.Savebtnclick(sender:TObject);
var
graphic1:TGraphic;
begin
graphic1:=TGraphic.Create;
graphic1.loadfromfile(opendialog1.filename);
table1.insert;
table1.fieldbyname('name').asstring:=edit1.text;
table1.fieldbyname('telephon').asstring:=edit2.text;
table1.fieldbyname('address').asfloat:=edit3.text;
table1.fieldbyname('zip').asfloat:=edit4.text;
table1.fields[4].assign(graphic1);
table1.post;
graphic1.free;
end;二、图像数据的读取
在数据库数据(包括Graphic字段的数据)的读取和浏览方面,Delphi这一具有强大代码自动生成功能的面向对象的开发工具的优越性得到淋漓尽致的体现。毫不夸张地说,不需要一条语句即可完成这一功能! 建立窗体(如下图所示),设置各控件的属性。 图中Table1和Datasource1的属性的设置与数据的保存部分(图1)相同,所不同的是数据库数据的读取时用TDBEdit和TDBImage控件而不用TEdit和TImage。控件TDBEdit和TDBImage只要将datafield属性设置为其相对应的域;TDBNavigator的datasouce属性设置为datasource1即可。
以下是我写的代码:
var
strm:tblobstream;
jpegimage:TJpegimage;
bitmap:tbitmap;
begin
strm := tblobstream.Create(tblobfield(table1.fieldbyname('CMTB')),bmread);
try //try1
strm.position :=0;
image1.Picture.Graphic := nil;
if table1.fieldbyname('isbmp').asstring ='1' then
begin //begin11
bitmap := tbitmap.Create ;
try //try11
bitmap.LoadFromStream(strm);
image1.Picture.Graphic := bitmap;
finally
bitmap.Free;
end; //end try11end //
end
else
if table1.fieldbyname('isbmp').asstring ='0' then
begin
//begin12
jpegimage := tjpegimage.Create ;
try //try12
jpegimage.LoadFromStream(strm);
image1.Picture.Graphic := jpegimage;
finally
jpegimage.Free ;
end; //end try12end; //
end ;
finally
strm.Free ;
end; //try1end; Table1就是连接数据库中存放图像字段的表的数据集,image1就是要在其中显示图像的控件,将改段代码添加在Table1的AfterScroll事件中!
这段代码我已经用过,没有问题的,希望对你有所帮助!
我这样定义
var
strm:tblobstream;
jpgimage:TJpgimage;
报错,定义非法。为啥呢,
uses
jepg; -->加上就可以啦
用一个openpicturedialog对话框控件,一个dbimage,将dbimage与数据库中对应的域连好,数据库中
对应类型为:image。
openpicturedialog的属性框中要设置一下,过滤,filter。点击……,出现一个过滤编辑对话框,
左侧名称为:所有jpg(自己起一个名字),右边*.jpg ;下一行一样
所有jpeg ,右边*.jpeg;
然后在option属性中的ofallowmultiselect 选择为true。 ok,下面编程:procedure TForm1.BitBtnChoseImageClick(Sender: TObject);
var
jpgimage,resizejpg: TJpegImage;
resizedbitmap : tbitmap;
newheight, newwidth : integer;
stretchrect : trect;
begin jpgimage :=tjpegimage.Create;
resizejpg:=tjpegimage.create;
resizedbitmap := tbitmap.create; if OPENpicturedialog1.Execute then
jpgimage.LoadFromFile(openpicturedialog1.FileName);
newheight := 217; //调整大小,你可以自己设置啦。
newwidth :=393;
stretchrect.left := 0;
stretchrect.Top := 0;
stretchrect.right := newwidth;
stretchrect.bottom := newheight;
resizedbitmap.Width := newwidth;
resizedbitmap.height := newheight; resizedbitmap.Canvas.StretchDraw(stretchrect, jpgimage);
dbimage1.Picture.Assign(resizedbitmap);
jpgimage.Free;
resizejpg.Free;
resizedbitmap.Free;
end;
向数据库中添加一步,就非常简单了,因为你的对应的域已经连好了,所以
你就直接向数据库添加就ok了。
希望能帮助你。祝你好运!
var
ImageBMP:Tbitmap;
ImageJPEG:Tjpegimage;
begin
try
if bsSkinOpenPictureDialog1.Execute then
begin
Data.dsProbation.DataSet.Edit;
if uppercase(ExtractFileExt(bsSkinOpenPictureDialog1.FileName))='.JPG' then
begin
ImageBMP:=Tbitmap.Create;
ImageJPEG:=TjpegImage.Create;
ImageJPEG.LoadFromFile(bsSkinOpenPictureDialog1.FileName);
ImageBMP.Assign(ImageJPEG);
ImageBMP.SaveToFile(ExtractFilePath(application.ExeName)+'TempBMP.BMP');
//bsSkinDBImage1.Picture.LoadFromFile(bsSkinOpenPictureDialog1.FileName);//
bsSkinDBImage1.Picture.LoadFromFile(ExtractFilePath(application.ExeName)+'TempBMP.BMP');
end
else
bsSkinDBImage1.Picture.LoadFromFile(bsSkinOpenPictureDialog1.FileName);
end;
except
unit1.frm_mian.bsSkinMessage1.MessageDlg('您选择的图片格式有误,请从新选择!', mtInformation, [mbOK], 0);
exit;
end;
end;
不知道是我用的控件问题还是DELPHI的BUG ,DBImage1不能正常显示JPG的图片,所以要把JPG的转成BMP的,如果在放入数据库,这样唯一不好的就是BMP的图太大了,影响数据库的质量!
下载代码:tblobfield(DBModule.QTmp.FieldByName('jpg')).SaveToFile(temp.jpg));
上传代码:tblobfield(DBModule.QTmp.FieldByName('jpg')).LoadFromFile(temp.jpg);
temp.jpg是图片名称,可以自己定义,也可以取数据库中表示文件名称的字段