📄 基于jpeg格式的图像数据库实现.txt
字号:
基于JPEG格式的图像数据库实现
作者:江明富
用VFP5.0开发多媒体应用时,存储图像通常使用的是BMP格式。
然而,由于幅面较大的BMP图像存储时占用存储空间较大,对于要管
理大量图像的应用,硬盘空间的占用将成为一个大问题。在众多图像
文件格式中JPEG格式压缩率最高,用JPEG格式将图像压缩20倍后,图
像仍然很清晰。VFP5.0能处理JPEG图像吗?回答是肯定的,我们可以
利用Wang图像控件达到目的。
Wang图像控件由Wang图像编辑控制、图像扫描控制、图像管理控
制及图像缩略图控制组成,它是一组Windows 95自带的控件,选择安
装Windows 95附件中的映像即可安装该控件。
Wang图像控件提供了图像扫描、图像打印、图像缩放、图像旋转、
在图像上加标签、生成缩略图、图像文件管理等功能,并且这些功能
的实现都可编程控制。这些控件的详细资料请参看Windows 95目录下
的Help\Wangocxd.hlp。
一、图像的扫描输入、存储、显示
创建“表单1.SCX"(见图)。插入Wang图像扫描对象imgscan的方
法是,在表单中插入“OLE容器控件”,出现“Insert Object"窗口
后,选“Insert Control",在“Object Type"列表中选择“Wang
图像扫描控制”,再点“OK"按钮;插入Wang图像编辑对象imgedit1,
将其AutoRefresh属性置为.T.,ImagePalette属性置为3,ImageControl
属性置为imgscan;再插入其它对象(按钮名称:左旋90度:btnleft,
扫描:btnscan,保存:btnsave,退出:btnexit),并置
text1.value=100,btnsave.enabled=.f.
btnscan.click过程为:
if thisform.imgscan.scanneravailable()&&如果安装了扫描
仪thisform.imgscan.DestImageControl=′imgedit1′&&扫描到
imgedit1thisform.imgscan.scanto=0thisform.imgscan.startscan
&&开始扫描if thisform.imgscan.statuscode=0&&扫描成功
thisform.btnsave.enabled=.t.&&允许保存endif
elsemessagebox(′扫描仪未安装好′,16)
endif
btnsave.click过程(保存按钮)为:
local m.fn
m.fn=sys(3)+′.jpg′
thisform.imgedit1.saveas(m.fn,1,6,6,64,.f.)
*把图像以JPEG格式存在临时文件中这里把64改为128、256、
....、16384 ,可得到不同压缩率
appe memo pic from (fn) overwrite&&图像存入数据库
erase (fn)
btnexit.click过程为:
thisform.release
btnleft.click过程为:
if thisform.imgedit1.imagedisplayed()&&如果已经显示了
图像
thisform.imgedit1.rotateleft&&左旋90度
endif
text1.valid过程为:
thisform.imgedit1.zoom=this.value&&改变图像显示大小
表单1的init过程为:
if eof()
append blank
endif
public grph&&下面几条命令实现JPG图像的显示
grph=sys(3)+′.jpg′
if not empty(pic)&&如果本记录已经存有图像copy memo pic
to (grph)thisform.imgedit1.image=m.grph&&就显示图像
thisform.imgedit1.displaythisform.btnsave.enabled=.t.
endif
这里把JPG图像存储在二进制备注型字段中。假设表文件image.dbf
有一二进制备注型字段pic(下同),执行下列语句:
use image
...&&把记录指针定位到所需位置
do form表单1.SCX
可以扫描图像存入当前记录,如果当前记录已存有图像,也可修
改(旋转)已有图像。如果经常修改库中的图像,FPT文件会不断增
大,可打开库,执行Pack命令。
二、在报表中插入数据库中存储的图像
在VFP5.0的报表中,只能插入“图片/OLE绑定型控
件”,图片只支持BMP格式,故为了在报表中打印JPG图像,必须
在打印前将JPG格式转换成BMP格式。下面新建报表imagerpt.frm,在
“页标头”部分插入了一“域控件”,“表达式”位置填入pimage(),
由pimage.prg临时生成要打印的图片文件(同一页面中要打印多张图
片时,生成多个临时文件),在“细节”部分插入一“图片/OLE绑
定型控件”,在其“图片来源”中,填入文件名(tmp);pimage.prg
内容如下:
if file(tmp)
erase (tmp)&&删除前一页生成的JPG文件
tmp=left(m.tmp,12)
erase (tmp)&&删除前一页生成的BMP文件
endif
tmp=sys(3)+′.jpg′
if not empty(pic)
copy memo pic to (tmp)&&生成JPG文件
myform.imgedit.image=m.tmp
myform.imgedit.display
myform.imgedit.saveas(m.tmp+′.bmp′,3,7,1,0,.t.)&&转
换成BMP文件
myform.imgedit.cleardisplay&&清除显示的图像
tmp=m.tmp+′.bmp′
endif
return
这里设计的报表不能单独运行,因为使用的对象在报表中没有定
义,要用下面这段程序调用:
private myform,tmp
MyForm = CREATEOBJECT(″form″)
*在表单中加入图像编辑控件
MyForm.AddObject(″imgedit″,″olecontrol″,
″wangimage.editctrl.1″)
tmp=sys(3)+′.bmp′
use image
report form imagerpt preview for not empty(pic)
if file(m.tmp)
erase (tmp)
tmp=left(m.tmp,12)
erase (tmp)
endif
release myform
三、图像的引入和导出
图像的引入是指把现有的图像文件加入数据库,图像的导出是指
把库中存储的图像取出,供其它程序使用。
Wang图像编辑控件能识别BMP、JPG、TIFF等格式的文件,用下面
这段程序可将现有文件转换成JPG格式,存入数据库中:
private myform,tmp
MyForm = CREATEOBJECT(″form″)
MyForm.AddObject(″imgedit″,″olecontrol″,
″wangimage.editctrl.1″)
tmp=sys(3)+′.jpg′
use image
...&&定位记录到所需位置
myform.imgedit.image=′要入库的图像文件名′
myform.imgedit.display
myform.imgedit.saveas(m.tmp,1,6,6,64,.t.)&&转换成JPG文
件
append memo pic from (tmp) overwrite
use
erase (tmp)
release myform
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -