(二)相应的解决方法 为了解决上述两个问题,可以采用目前数据库中一种名为大二分对象(BLOB--Bina ry Large Object),它是用来处理某些特殊格式的数据的。BLOB在数据库的表中实际上 是以二进制数据的形式存放的。为了处理BLOB字段,可以借鉴一些可视的桌面数据库的 方法。在这里,我们选择了通过内存流的方式来完成;使用内存流,可减少磁盘操作, 大大提高运行效率。 具体的过程和相关的程序代码如下:
1、如何实现在Microsoft Access数据库中的图像存储: 这里是利用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 MyJPEG : TJPEGImage; MS : TMemoryStream; Begin Try MS := TMemoryStream.Create; TBlobField(Query1.FieldByName('Image')).SaveToStream(MS); MS.Position := 0; MyJPEG := TJPEGImage.Create; MyJPEG.LoadFromStream(MS); DBImage1.Picture.Bitmap.Assign(MyJPEG); //或是Sender.Picture.Assign(MyJPEG); Finally MS.Free; MyJPEG.Free; End; End; 这段代码的主要作用是:首先将查询结果中的JPEG图像格式数据保存到TMemoryStream中去, 然后设置数据指针在TMemoryStream中的位置为0;接着从TMemoryStream中读入相关数据, 并把它们赋给TDBImage.Picture.Bitmap,这样一来就实现了将数据库中所存储的JPEG格式的 数据转化为BMP格式,并在TDBImage中将图像显示出来。最后将TMemoryStream和TJPEGImage 这两个对象释放掉。特别要注意的是不能在设计阶段设置TDBImage的DataField属性,而只能 通过写代码的形式在运行阶段把利用流式数据所转化过来的新格式的图像数据赋给TDBImage.Picture.Bitmap。