在《Delphi存取图像完整解决方案》一文中,笔者提供了一种DELPHI存取JPEG、BMP图像到数据库的解决方案,虽然它适用于ACCESS和SQL数据库,但它并不适用于所有数据库(比如PARADOX数据库中的GRAPHIC图像字段就不能采用该方法存取图像数据),下文将介绍DELPHI利用ASSIGN方法存取JPEG、BMP图像到数据库的另一解决方案来进行补充完善。演示数据库结构和窗口界面设计同前文,不再重述,将单元的相应程序代码作如下更换: 1. 图像数据的选择及保存procedure Tform1.selectimageClick(Sender: TObject); //选择图像 begin if openpicturedialog1.Execute then image1.Picture.LoadFromFile(openpicturedialog1.FileName ); end; procedure Tform1.savetodbClick(Sender: TObject); //保存图像到数据库 var ext:string; begin if image1.picture.Graphic <> nil then //避免image1中无图像保存出错 begin adotable1.Edit ; adotable1.FieldByName('myimage').Assign(image1.Picture.Graphic); //以下记录保存到数据库的图像格式 ext:=extractfileext(openpicturedialog1.FileName ); //取出文件扩展名 if uppercase(ext) = '.BMP' THEN adotable1.FieldByName('isbmp').VALUE := 1 //BMP型图像数据 ELSE IF (UPPERCASE(EXT) = '.JPEG') OR (UPPERCASE(EXT) = '.JPG') THEN adotable1.FieldByName('isbmp').VALUE := 0; //JPEG型图像数据 ADOTABLE1.Post ; end; end; 2. 图像数据的读取及显示procedure Tform1.ADOTable1AfterScroll(DataSet: TDataSet); //ADOTable1的AfterScroll事件方法程序 var jpegimage:tjpegimage; begin image1.Picture.Graphic :=nil; //下边BMP、JPEG两种图像数据必需分别处理 if adotable1.fieldbyname('isbmp').Asstring = '1' then //BMP型图像数据 image1.Picture.bitmap.Assign(adotable1.fieldbyname('myimage')) //上边语句中的bitmap不能为graphic,否则会出错 else if adotable1.fieldbyname('isbmp').asstring = '0' then //JPEG型图像数据 begin //begin2 jpegimage := tjpegimage.Create ; //通过jpegimage将图像显示在image1,否则会出错 try jpegimage.Assign(adotable1.fieldbyname('myimage')); image1.Picture.Graphic :=jpegimage; finally jpegimage.Free ; end; //end try end; //end begin2 end; 注:别忘了在单元文件接口部分的uses语句中添入JPEG单元引用。 以上程序代码在DELPHI6.0+SQL(或ACCESS或PARADOX)数据库下运行通过。
如何保存和显示JEPG格式图象数据? 我相信你看完了下面的介绍,应该可以掌握了吧!呵呵!!~~~TImage不能识别JEPG格式的图象数据,涉及jpg图片的操作(显示、存数据库等)要用TJPGImage类! 下面是一个简单的例子(数据库与上面一个例子相同): //打开、显示JPG图片,添加图象数据到数据库 procedure TForm1.Button3Click(Sender: TObject); Var JPGImage:TjpegImage; Bitmap:TBitmap; Stream : TMemoryStream; FileName:String; ExtName: string; begin JPGImage:=TJpegImage.Create; //打开图象文件 if OpenPictureDialog1.Execute Then begin FileName:=OpenPictureDialog1.FileName; ExtName:=AnsiUpperCase(ExtractFileExt(FileName)); //后缀名 //JPGImage加载图象。对两种类型的图象文件:.BMP和.JPG分别处理 if ExtName=‘.BMP‘ then begin Bitmap:=TBitmap.Create; Bitmap.LoadFromFile(FileName); JPGImage.Assign(Bitmap); JPGImage.Compress; //压缩成JPEG格式 Bitmap.Free; end; if ExtName=‘.JPG‘ Then JPGImage.LoadFromFile(FileName); //JPG图象保存到数据库,要以MemoryStream为中介 Stream:= TMemoryStream.Create ; JPGImage.SaveToStream(Stream); table1.append; table1FileName.asstring:=ExtractFileName(FileName); table1Blob.LoadFromStream(Stream); table1.Post; Image1.Picture.Assign(JPGImage); Stream.Free ; end; end; //显示图象 procedure TForm1.Table1AfterScroll(DataSet: TDataSet); var Stream : TStream; JPGImage : TJpegImage; begin JPGImage:=Tjpegimage.Create; if not table1Blob.isNull Then begin Stream:=TBlobStream.Create(Table1Blob,bmRead); JPGImage.LoadFromStream(stream); Image1.Picture.Assign(JPGImage); Stream.Free; end else Image1.Picture.Assign(Nil); JPGImage.Free; end;
begin
if openpicturedialog1.Execute then
image1.Picture.LoadFromFile(openpicturedialog1.FileName );
end;
procedure Tform1.savetodbClick(Sender: TObject); //保存图像到数据库
var
ext:string;
begin
if image1.picture.Graphic <> nil then //避免image1中无图像保存出错
begin
adotable1.Edit ;
adotable1.FieldByName('myimage').Assign(image1.Picture.Graphic);
//以下记录保存到数据库的图像格式
ext:=extractfileext(openpicturedialog1.FileName ); //取出文件扩展名
if uppercase(ext) = '.BMP' THEN
adotable1.FieldByName('isbmp').VALUE := 1 //BMP型图像数据
ELSE IF (UPPERCASE(EXT) = '.JPEG') OR (UPPERCASE(EXT) = '.JPG') THEN
adotable1.FieldByName('isbmp').VALUE := 0; //JPEG型图像数据
ADOTABLE1.Post ;
end;
end; 2. 图像数据的读取及显示procedure Tform1.ADOTable1AfterScroll(DataSet: TDataSet); //ADOTable1的AfterScroll事件方法程序
var
jpegimage:tjpegimage;
begin
image1.Picture.Graphic :=nil;
//下边BMP、JPEG两种图像数据必需分别处理
if adotable1.fieldbyname('isbmp').Asstring = '1' then //BMP型图像数据
image1.Picture.bitmap.Assign(adotable1.fieldbyname('myimage'))
//上边语句中的bitmap不能为graphic,否则会出错
else if adotable1.fieldbyname('isbmp').asstring = '0' then //JPEG型图像数据
begin //begin2
jpegimage := tjpegimage.Create ; //通过jpegimage将图像显示在image1,否则会出错
try
jpegimage.Assign(adotable1.fieldbyname('myimage'));
image1.Picture.Graphic :=jpegimage;
finally
jpegimage.Free ;
end; //end try
end; //end begin2
end; 注:别忘了在单元文件接口部分的uses语句中添入JPEG单元引用。 以上程序代码在DELPHI6.0+SQL(或ACCESS或PARADOX)数据库下运行通过。
procedure TForm1.Button3Click(Sender: TObject);
Var
JPGImage:TjpegImage;
Bitmap:TBitmap;
Stream : TMemoryStream;
FileName:String;
ExtName: string;
begin
JPGImage:=TJpegImage.Create;
//打开图象文件
if OpenPictureDialog1.Execute Then
begin
FileName:=OpenPictureDialog1.FileName;
ExtName:=AnsiUpperCase(ExtractFileExt(FileName)); //后缀名 //JPGImage加载图象。对两种类型的图象文件:.BMP和.JPG分别处理
if ExtName=‘.BMP‘ then
begin
Bitmap:=TBitmap.Create;
Bitmap.LoadFromFile(FileName);
JPGImage.Assign(Bitmap);
JPGImage.Compress; //压缩成JPEG格式
Bitmap.Free;
end; if ExtName=‘.JPG‘ Then
JPGImage.LoadFromFile(FileName); //JPG图象保存到数据库,要以MemoryStream为中介
Stream:= TMemoryStream.Create ;
JPGImage.SaveToStream(Stream); table1.append;
table1FileName.asstring:=ExtractFileName(FileName);
table1Blob.LoadFromStream(Stream);
table1.Post; Image1.Picture.Assign(JPGImage);
Stream.Free ;
end; end; //显示图象
procedure TForm1.Table1AfterScroll(DataSet: TDataSet);
var
Stream : TStream;
JPGImage : TJpegImage;
begin
JPGImage:=Tjpegimage.Create;
if not table1Blob.isNull Then
begin
Stream:=TBlobStream.Create(Table1Blob,bmRead);
JPGImage.LoadFromStream(stream);
Image1.Picture.Assign(JPGImage);
Stream.Free;
end
else
Image1.Picture.Assign(Nil);
JPGImage.Free; end;