TWAIN规范的第四章

发布时间 : 星期四 文章TWAIN规范的第四章更新完毕开始阅读

TW_MEMORY结构:Flags为TWMF_DSOWNS,Length为 TWON_DONTCARE32,TheMem为NULL。源应假定程序将保持之前的缓冲区而不会释放它,因此,源应为每次传输分配一个新的缓冲区。

? 应用程序必须负责销毁缓存。

? 最后,应用程序不应假定tiles会以任何特定的或逻辑的顺序进行传输。

4.5.1 JPEG压缩

TWAIN支持传输多种格式的压缩数据,JPEG压缩是其中一种。JPEG压缩算法为灰度和真彩图像提供了比例从10:1到25:1的压缩比例,代价则是图像质量的下降。此压缩由应用程序通过一系列“感知性的”过滤器分三个阶段完成:

4.5.1.1 颜色空间转换和分量二次取样(针对彩色图像)

由于平均拥有100百万个光线感知器(杆状细胞)和仅约6万个颜色感知器(视锥细胞),人眼对光的强度(亮度)的感知要比对光频率(色度,或“色彩”)敏感得多。通过将彩色图像转换到一个更有效的亮度/色度颜色空间并对色度分量进行二次取样能够轻易地将图像压缩许多。 此转换使用TW_JPEGCOMPRESSION。将TW_JPEGCOMPRESSION.ColorSpace指定为TWPT_YUV,RGB数据被转换为空间上更高效的YUV数据(以CCIR 601-1或YCbCr最广为人知)。

TW_JPEGCOMPRESSION.SubSampling指定最终的YUV数据流中亮度和色度样本的比例。典型的选择是每个色彩样本对两个亮度样本,这通过将

TW_JPEGCOMPRESSION.SubSampling值设置为0x21102110来指定。一个更大的比例“每个色彩样本对4个亮度样本”由0x41104110表示。 4.5.1.2 应用离散余弦变换(DCT)和量子化

接下来原分量(经过或未经过颜色空间转换)通过DCT被算术地转换到一个空间频率表示法,然后使用量子矩阵进行过滤(每个频率都被划分到量子矩阵上相关的成员)。量子矩阵由TW_JPEGCOMPRESSION.QuantTable[]指定,可为最多四种不同的

源分量定义最多四个量子矩阵。TW_JPEGCOMPRESSION.QuantMap[]将特定的源分量映射到各个的量子矩阵。

注:JPEG互联网草案标准的K部分推荐为量子映射和量子矩阵提供默认值。TWAIN使用10918-1版本作为QuantTable、HuffmanDC和HuffmanAC和默认表。默认值通过将NULL选入TW_JPEGCOMPRESSION.QuantTable[]来指定。 4.5.1.3 哈夫曼编码

经过DCT和量子化的结果最后通过一个称为哈夫曼编码的无损压缩算法进行进一步压缩。应用程序开发者可提供哈夫曼表,不过一般都使用默认的表(将NULL选入

TW_JPEGCOMPRESSION.HuffmanDC[]和TW_JPEGCOMPRESSION.HuffmanAC[])。 此算法选择支持使用重启标记代码,以允许随机读取JPEG数据流进行解压。更多描述请参考JPEG规范。

4.6 可选用户界面

是否使用源管理器提供的源选择对话框是可选的。

TWAIN包装了源管理器代码以作为应用程序和源的通信中介。源管理器提供的服务之一是找出匹配用户要求的可用源并将它们显示给用户进行选择。

我们推荐应用程序使用此接口,但没有强制要求,存在两种可选的替代方式:

1. 程序可开发并显示自定义的选择界面,这在响应用户从菜单中选择“Select Source...”时显示。

2. 如果程序专注于控制某个特定源,程序可直接选择此源。在这种情况下,从功能上说程序并不需要菜单项“Select Source..”,不过为保持与其它TWAIN兼容程序的一致性,应显示一个灰色的不可用菜单项。 显示自定义选择界面:

1. 使用DG_CONTROL / DAT_IDENTITY / MSG_GETFIRST操作使源管理器查找第一个可用源。源的名称包含在TW_IDENTITY.ProductName域中。保存此TW_IDENTITY结构。 2. 使用DG_CONTROL / DAT_IDENTITY / MSG_GETNEXT操作使源管理器获取下一个,重复此操作直到它返回一个表示没有其它可用源的TWRC_ENDOFLIST。同样应保存此TW_IDENTITY结构。

3. 将ProductName信息展示给用户进行选择。作出选择后,使用相关的TW_IDENTITY结构和DG_CONTROL / DAT_IDENTITY / MSG_OPENDS操作来使源管理器打开指定的源。

注:使用这种方式时,与MSG_USERSELECT 操作相对地,源管理器不会更新系统默认源信息以反映用户的选择。 直接选择源:

若程序想打开系统默认源,可使用DG_CONTROL / DAT_IDENTITY / MSG_GETDEFAULT操作来使源管理器查找默认源并用其信息填充TW_IDENTITY。

另外,如果想要使用的源不是默认源但知道其名称,可以使用DG_CONTROL /

DAT_IDENTITY / MSG_GETFIRST和G_CONTROL / DAT_IDENTITY / MSG_GETNEXT操作来遍历所有源直至找到与指定名称匹配的源,然后使用相应的TW_IDENTITY结构来打开源。

注:使用这种方式时,源管理器同样不会更新系统默认源信息以反映用户的选择。

4.6.1 可选源用户界面

与源管理器的源选择对话框一样,程序可能要求不使用源的用户界面。例如某些文本识别插件只希望协商少数性能(如像素类型、分辨率、页面尺寸等)然后就直接获取和传输数据。 为了在不显示用户界面的情况下启用源:

? 使用 DG_CONTROL / DAT_USERINTERFACE / MSG_ENABLEDS。 ? 将TW_USERINTERFACE.ShowUI域设置为FALSE。

? 收到并接受命令后,源将不显示用户界面但将开始采集数据。例如对于平板扫描仪,光标光将发光并开始移动;对于手持式扫描仪,将准备在“GO”按钮被按下时开始采集数据。其它设备可能有不同的响应,但都将立即开始采集或准备在用户触发后立即采集数据。 不显示源用户界面时性能协商非常重要:

? 因为源用户界面不显示,源无法向用户提供选择要采集信息的机会等。除非默认值是可接受的,否则所有有关图像采集的当前值和控制参数都必须在源启用前协商好(状态4)。 若TW_USERINTERFACE.ShowUI 被设置为FALSE:

? 源启用时,程序仍然要将所有事件传递给源(通过DG_CONTROL / DAT_EVENT / MSG_PROCESSEVENT)。

? 源应显示仅包含使设备在上下文中可用所必须的控制项的尽可能小的用户界面。通常这意味着不显示用户界面,但有些设备还是要求一个触发器来启动扫描。

? 在采集过程中源仍然显示进度条、错误和其它一些与设备操作有关消息。若源指定

CAP_UICONTROLLABLE为TRUE,则程序可通过设置CAP_INDICATORS为FALSE来禁用它。

? 数据准备好被传输时,源仍然将向程序发送MSG_XFERREADY通知。

? 由于通常由用户触发,源也许会,也许不会向程序发送MSG_CLOSEDSREQ消息以要求关闭。因此,在源回到状态5后(紧随DG_CONTROL / DAT_PENDINGXFERS /

MSG_ENDXFER操作并且TW_PENDINGXFERS.Count为0),程序可发送DG_CONTROL / DAT_USERINTERFACE / MSG_DISABLEDS操作。

总结:在ShowUI被设为FALSE后,一些源仍可能显示UI。程序可通过

CAP_UICONTROLLABLE性能来查询ShowUI能否被设置。如果CAP_UICONTROLLABLE 为FALSE而 ShowUI也被设为FALSE,则启用源的操作将返回TWRC_CHECKSTATUS,但会显示UI。因此,想要禁用UI的程序应先查询CAP_UICONTROLLABLE。

4.6.2 模态和非模态用户界面

源管理器的用户界面是是模态的,但源可能提供模态或非模态的界面,下面是两者间的差别: 非模态:

当源使用非模态界面时,虽然源界面是显示的,但用户仍然可以通过单击程序窗口并激活它以操作程序。

用户被期望在想停止显示源用户界面时单击其关闭按钮。程序不应在任何传输动作后自动关闭一个非模态源,即使程序只想要单次传输。如果程序在用户请求前关闭了源,则用户很可能会迷惑于窗体为什么消失了。请等到用户表示希望关闭后再关闭源的界面,并在程序关闭源之前等待源发送MSG_CLOSEDSREQ请求。 模态:

使用模态用户界面的源不允许用户操作其它窗口。对Windows来说,如果界面是程序模态,则用户不能操作其它应用程序但仍然可能操作系统程序。如果界面是系统模态(这很少见),则用户无法在应用程序和系统级操作任何东西。系统模态对话框可能被用于显示高级错误消息,例如UAE。

若使用模态界面,则在一次会话期间源只能进行一次采集,不过每次采集可能包含多个框架。数据传输完毕后源将向程序发送关闭请求,相对地,源等待该请求。

联系合同范文客服:xxxxx#qq.com(#替换为@)