注: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。
若使用模态界面,则在一次会话期间源只能进行一次采集,不过每次采集可能包含多个框架。数据传输完毕后源将向程序发送关闭请求,相对地,源等待该请求。
源将在程序通过DG_CONTROL / DAT_USERINTERFACE / MSG_ENABLEDS启用它之后表明它将使用模态或非模态界面。此操作中使用的TW_USERINTERFACE结构包含一个ShowUI域,由程序设置用于声明源是否应显示用户界面。如果程序要求显示用户界面,则它也将通过此域来声明希望源采用模态(TRUE)还是非模态(FALSE)界面。
若源有请求,则可通过DG_CONTROL / DAT_USERINTERFACE / MSG_DISABLEDS 操作来去掉源用户界面。
4.7 灰度和图像信息
TWAIN中有一些操作元组允许应用程序开发者交流和影响图像(从源传输到程序)的灰度和颜色外观等信息。以下操作提供了此能力: ? CIE Color Descriptors
DG_IMAGE / DAT_CIECOLOR / MSG_GET ? Grayscale Changes
DG_IMAGE / DAT_GRAYRESPONSE / MSG_RESET DG_IMAGE / DAT_GRAYRESPONSE / MSG_SET ? Palette Color Data
DG_IMAGE / DAT_PALETTE8 / MSG_GET DG_IMAGE / DAT_PALETTE8 / MSG_GETDEFAUL DG_IMAGE / DAT_PALETTE8 / MSG_RESET DG_IMAGE / DAT_PALETTE8 / MSG_SET ? RGB Response Curve Data
DG_IMAGE / DAT_RGBRESPONSE / MSG_RESET DG_IMAGE / DAT_RGBRESPONSE / MSG_RESET
4.7.1 CIE Color Descriptors(颜色描述子)
CIE XYZ是一种能够简化对数据的数学操作的颜色存储方式。(附录A讨论有关XYZ颜色空间和话题)。
若程序希望以此格式接收图像数据:
1. 确保源支持CIE XYZ格式。可通过对性能 ICAP_PIXELTYPE的DG_CONTROL / DAT_CAPABILITY / MSG_GET操作来检查。若支持则返回的支持类型中将包含TWPT_CIEXYZ。
2. 通过对性能 ICAP_PIXELTYPE的DG_CONTROL / DAT_CAPABILITY / MSG_SET操作来指定应使用CIE XYZ格式来传输数据,操作使用一个值为TWPT_CIEXYZ的TW_ONEVALUE容器。
为确定源将颜色数据转换为CIE XYZ格式时所使用的参数,请在图像传输后使用 DG_IMAGE / DAT_CIECOLOR / MSG_GET 操作。
4.7.2 灰度转换
(假定程序已经通过将ICAP_PIXELTYPE设置为TWPT_GRAY来通知源提供灰度数据并且源已接受)
程序可要求源在将数据传输至程序前对灰度数据进行曲线变换,相关操作为 DG_IMAGE / DAT_GRAYRESPONSE / MSG_SET,变换曲线信息由程序通过一个TW_GRAYRESPONSE结构指定。程序务必检查此请求的返回值,若返回TWRC_FAILURE并且状态码为TWCC_BADPROTOCOL,则表示程序不支持灰度的响应转换(与支持灰度数据无关)。 如果源允许程序设置灰度转换,则应有重置转换的途径。因此,源应有一种直接传输而不转换任何灰度数据的“恒等转换”。程序可通过DG_IMAGE / DAT_GRAYRESPONSE / MSG_RESET请求来重置转换。
4.7.3 调色板颜色数据
(假定程序已经通知源将ICAP_PIXELTYPE置为TWPT_PALETTE且源已接受)
DAT_PALETTE8操作允许程序请求源对调色板颜色数据的支持并启动调色板颜色的传输。此操作限定为8位数据,不论是灰度还是采色(8位或24位)。MSG_GET操作允许程序了解源在采集数据时使用的调色板。程序应总是在立即在图像传输后而不是之前执行此操作,因为源可能在采集过程中优化调色板。某些源可能允许程序通过MSG_SET来定义图像采集使用调色板。务必检查返回值以核实操作返回了TRRC_SUCCESS,这是确定你要求的调色板是否会真实的用于随后的调色板传输的唯一方法。
4.7.4 RGB响应曲线数据