当前位置:文档之家› Powerbuilder中Kodak图像扫描控件应用技巧

Powerbuilder中Kodak图像扫描控件应用技巧

Powerbuilder中Kodak图像扫描控件应用技巧
Powerbuilder中Kodak图像扫描控件应用技巧

Powerbuilder中Kodak图像扫描控件应用技巧

摘要Powerbuilder中对Kodak图像扫描控件应用的技巧,主要是对扫描出来的图像进行文件头修改,以保证在Powerbuilder中的正确显示和应用。

关键词Powerbuilder;Kodak图像扫描控件;BMP;图像文件头

1 引言

当前在开发管理信息系统中,Sybase公司的Powerbuilder(下文中简称PB)是一个使用非常广泛的语言工具,其数据窗口功能使得数据库系统的开发变得非常简单和快捷。笔者在使用Powerbuilder 10.5版本开发一个管理信息系统时,要求把人员的身份证照片扫描并存入数据库,在使用Kodak图像扫描控件时碰到了麻烦,图像能够扫描并存成图像文件,但是在PB中就是不能显示。经过笔者查阅各种资料,并对扫描形成的文件格式进行分析,终于解决了这个问题,笔者把相关技术知识及处理方法写出来,以便大家参考。

2BMP文件的结构

首先介绍一下BMP文件的知识:

BMP文件可分为四个部分:位图文件头、位图信息头、彩色板、图像数据阵列。如:

42 4D 50 07 00 00 00 00 00 00 3E 02 00 00 28 00

00 00 24 00 00 00 24 00 00 00 01 00 08 00 00 00

00 00 10 05 00 00 12 0B 00 00 12 0B 00 00 82 00

00 00 82 00 00 00 FF FF FF 00 F3 F3 F3 00 E3 F4...

2.1图像文件头

(1)1:(这里的数字代表的是"字",即两个字节,下同)图像文件头。424Dh=’BM’,表示是Windows

支持的BMP格式。

(2)2-3:整个文件大小。5007 0000,为00000750h=1872。

(3)4-5:保留,必须设置为0。

(4)6-7:从文件开始到位图数据之间的偏移量。3E02 0000,为0000023Eh=574。

(5)8-9:位图图信息头长度,一般为28h=40字节。

(6)10-11:位图宽度,以像素为单位。2400 0000,为00000024h=36。

(7)12-13:位图高度,以像素为单位。2400 0000,为00000024h=36。

(8)14:位图的位面数,该值总是1。0100,为0001h=1。

2.2位图信息头

(1)15:每个像素的位数。有1(单色),4(16色),8(256色),16(64K色,高彩色),24(16M 色,真彩色),32(4096M色,增强型真彩色)。0800为0008h=8。

(2)16-17:压缩说明:有0(不压缩),1(RLE 8,8位RLE压缩),2(RLE 4,4位RLE压缩),3(Bitfields,位域存放)。RLE简单地说是采用像素数+像素值的方式进行压缩。T408采用的是位域存放方式,用两个字节表示一个像素,位域分配为r5b6g5。图中0000 0000为00000000h=0。

(3)18-19:用字节数表示的位图数据的大小,该数必须是4的倍数,数值上等于位图宽度×位图高度×每个像素位数。1005 0000为00000510h=36×36×1h=1296。

(4)20-21:用像素/米表示的水平分辨率。120B 0000为0000 0B12h=2834。

(5)22-23:用像素/米表示的垂直分辨率。120B 0000为0000 0B12h=2834。

(6)24-25:位图使用的颜色索引数。设为0的话,则说明使用所有调色板项。

(7)26-27:对图象显示有重要影响的颜色索引的数目。如果是0,表示都重要。

2.3彩色板

28-35:彩色板规范。

2.4图像数据阵列

36-...:每两个字节表示一个像素。阵列中的第一个字节表示位图左下角的像素,而最后一个字节表示位图右上角的像素。

3用Kodak图像扫描控件扫描出来的BMP不能显示的原因分析通过BMP结构知识的了解,我们对BMP的结构有了一个基本的认识,对于PB中Kodak图像扫描控件扫描出来的BMP文件为什么不能显示,我们来看看扫描出来的文件头部分:

42 4D AA A7 23 00 00 00 00 00 8A 00 00 00 7C 00

00 00 28 04 00 00 DC 02 00 00 01 00 18 00 00 00

00 00 20 A7 23 00 B4 2D 00 00 B4 2D 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 42 47 52 73 00 00 00 00 00 00

对比BMP文件结构知识里面的说明,我们可以发现第8-9字节的内容为7C 00 00 00,而不是一般的28 00 00 00,查阅其它资料后发现:在Windows95、98、2000等操作系统中,位图信息头的长度并不一定是28h,因为微软已经制定出了新的BMP文件格式,其中的信息头结构变化比较大,长度加长。会不会是这个原因引起PB程序不能显示这个格式的Bmp文件呢?笔者把扫描的文件用UltraEdit进行了编辑,保持其它的不动,把8-9字节从7C 00 00 00改为28 00 00 00,然后用PB打开,果然,图像显示出来了。这证明PB只是认识以前格式的BMP文件,对新的BMP文件格式不能识别,因而不能显示。

4 解决方法及实例

基于上述原因,我们可以在PB中把图像的文件头修改为PB认识的格式从而让PB能够处理从Kodak

图像扫描控件扫描出来的图像文件。具体例程如下:

long ll_i,ll_rt

string ls_imgpath

ls_imgpath = GetCurrentDirectory( )+ "\sfz"//扫描图像存放路径

ole_1.object.scroll=true//是否选中滚动

ole_1.object.showsetupbeforescan=true//是否在扫描前显示扫描以设置界面

ll_i=ole_1.object.openscanner()//打开扫描仪,成功返回0

IF ll_i=0 THEN

ole_1.object.filetype=3 //扫描图像的类型:tif,bmp,jpg.....

ole_1.object.image=ls_imgpath//扫描图像存放路径

ole_1.object.MultiPage=false//是否多页

ole_1.object.pageoption=6//页选项,6就是改写所有页面(改写文件)

ole_1.object.scanto=2//扫描到,4就是只使用文件模版

ole_1.object.startscan()//开始扫描

ole_1.object.closescanner()//关闭扫描仪

integer fh,ret,loops,i

blob b,b1

string txtname,named

txtname= ls_imgpath+'.bmp'

long flen

flen=filelength(txtname)

fh = FileOpen(txtname,StreamMode!)

IF flen > 32765 THEN

IF Mod(flen,32765) = 0 THEN

loops = flen/32765

ELSE

loops = (flen/32765) + 1

END IF

ELSE

loops = 1

END IF

IF fh <> -1 THEN

emp_pic=b

for i=1 to loops

FileRead(fh,b)

Emp_pic=Emp_pic+b

next

FileClose(fh)

b=emp_pic

b=emp_pic

b1=blobmid(b,1,14)+blob(char(40))+blobmid (b,17)

Emp_pic=b1

p_1.SetPicture(Emp_pic)

END IF

ELSE

messagebox("错误!","扫描仪打开错误,请检查扫描仪!")

END IF

以上程序在Powerbuilder 10.5版本调试通过。

参考文献

[1] David C.Kay .《图形图像文件格式大全》.北京:学苑出版社,1994

WEB设计 日期时间选择器

//%%%%%%%%%%%%%%%時間選擇器%%%%%%%%%%%%% var str=""; document.writeln("

"); str+="\u65f6\u5206\u79d2
"; document.writeln(str); var_fieldname; function_SetTime(tt){ _fieldname=tt; var ttop=tt.offsetTop;//TT控件的定位点高 var thei=tt.clientHeight;//TT控件本身的高 var tleft=tt.offsetLeft;//TT控件的定位 while(tt=tt.offsetParent){ ttop+=tt.offsetTop;

JS日期控件

JS日期控件 转发评论 2008-06-11 14:19 超级简单好用的JS日期控件 效果如图所示: 用的时候先在插入 然后输入框 当鼠标放在输入框的时候,出现时间控件,选取时间后,JS自动的将时间控件的值赋给starttime2。由于给starttime2加了 runat="server"属性,所以在后台可以取starttime2的Value值。 setday.js下载 提供的setday.js默认是UTF-8编码,也就是VS的默认编码,如果你的页面声明是GB等其他编码,请用一下高级保存,转换一下编码。 setday.js代码: