ZBLOG

twaindsm.dll 设置回调扫描图片,获取图片信息保存在本地实例 twain2.4

以下是一个使用TWAIN 2.4接口和回调函数来扫描图片并保存到本地的示例代码:

  1. #include <windows.h>
  2. #include <iostream>
  3. #include <vector>
  4. // TWAIN 头文件
  5. #include "twain.h"
  6. // 回调函数
  7. TW_UINT16 FAR PASCAL MyCallbackProc(pTW_IDENTITY pOrigin, pTW_IDENTITY pDest, TW_UINT32 data);
  8. int main()
  9. {
  10. // 初始化 TWAIN 应用程序
  11. HWND hwnd = GetDesktopWindow();
  12. TW_IDENTITY appId;
  13. memset(&appId, 0, sizeof(TW_IDENTITY));
  14. appId.Id = 0;
  15. appId.Version.MajorNum = 2;
  16. appId.Version.MinorNum = 4;
  17. appId.ProtocolMajor = TWON_PROTOCOLMAJOR;
  18. appId.ProtocolMinor = TWON_PROTOCOLMINOR;
  19. // 打开源管理器对话框
  20. TW_INT16 twrc = DSM_Entry(&appId, nullptr, DG_CONTROL, DAT_PARENT,
  21. MSG_OPENDSM, (TW_MEMREF)&hwnd);
  22. if (twrc != TWRC_SUCCESS) {
  23. std::cout << "打开源管理器失败" << std::endl;
  24. return -1;
  25. }
  26. // 获取默认源标识符
  27. TW_IDENTITY sourceId;
  28. twrc = DSM_Entry(&appId, nullptr, DG_CONTROL, DAT_IDENTITY,
  29. MSG_GETDEFAULT, (TW_MEMREF)&sourceId);
  30. if (twrc != TWRC_SUCCESS) {
  31. std::cout << "获取默认源标识符失败" << std::endl;
  32. return -1;
  33. }
  34. // 打开源,建立与设备的连接
  35. twrc = DSM_Entry(&appId, &sourceId, DG_CONTROL, DAT_IDENTITY,
  36. MSG_OPENDS, (TW_MEMREF)&sourceId);
  37. if (twrc != TWRC_SUCCESS) {
  38. std::cout << "打开源失败" << std::endl;
  39. return -1;
  40. }
  41. // 注册回调函数
  42. twrc = DSM_Entry(&appId, &sourceId, DG_CONTROL, DAT_CALLBACK,
  43. MSG_REGISTER_CALLBACK, (TW_MEMREF)&MyCallbackProc);
  44. if (twrc != TWRC_SUCCESS) {
  45. std::cout << "注册回调函数失败" << std::endl;
  46. return -1;
  47. }
  48. // 设置扫描参数
  49. TW_USERINTERFACE twUI;
  50. memset(&twUI, 0, sizeof(TW_USERINTERFACE));
  51. twUI.ShowUI = TRUE; // 显示源管理器的用户界面
  52. twUI.ModalUI = TRUE; // 模态对话框方式显示
  53. twrc = DSM_Entry(&appId, &sourceId, DG_CONTROL, DAT_USERINTERFACE,
  54. MSG_ENABLEDSUSERINTERFACE,(TW_MEMREF)&twUI);
  55. if (twrc != TWRC_SUCCESS) {
  56. std::cout << "设置扫描参数失败" << std::endl;
  57. return -1;
  58. }
  59. // 等待扫描完成,此处可根据需要添加超时机制或其他处理逻辑
  60. // 关闭源
  61. twrc = DSM_Entry(&appId, &sourceId, DG_CONTROL, DAT_IDENTITY,
  62. MSG_CLOSEDS,(TW_MEMREF)&sourceId);
  63. if (twrc != TWRC_SUCCESS) {
  64. std::cout << "关闭源失败" << std::endl;
  65. return -1;
  66. }
  67. // 关闭源管理器
  68. twrc = DSM_Entry(&appId, nullptr, DG_CONTROL, DAT_PARENT,
  69. MSG_CLOSEDSM,(TW_MEMREF)&hwnd);
  70. if (twrc != TWRC_SUCCESS) {
  71. std::cout << "关闭源管理器失败" << std::endl;
  72. return -1;
  73. }
  74. return 0;
  75. }
  76. // 回调函数
  77. TW_UINT16 FAR PASCAL MyCallbackProc(pTW_IDENTITY pOrigin, pTW_IDENTITY pDest, TW_UINT32 data)
  78. {
  79. // 获取图像数据并保存到本地文件
  80. TW_IMAGEINFO imageInfo;
  81. memset(&imageInfo, 0, sizeof(TW_IMAGEINFO));
  82. // 获取图像信息
  83. TW_INT16 twrc = DSM_Entry(nullptr, nullptr, DG_IMAGE,
  84. DAT_IMAGEINFO, MSG_GET,&imageInfo);
  85. if (twrc != TWRC_SUCCESS) {
  86. std::cout << "获取图像信息失败" << std::endl;
  87. return TWRC_FAILURE;
  88. }
  89. // 分配缓冲区用于保存图像数据
  90. std::vector<TW_UINT8> imageData(imageInfo.ImageSize);
  91. // 获取图像数据
  92. twrc = DSM_Entry(nullptr,nullptr,DG_IMAGE,DAT_IMAGENATIVEXFER,
  93. MSG_GET,(TW_MEMREF)imageData.data());
  94. if (twrc != TWRC_XFERDONE) {
  95. std::cout << "获取图像数据失败" << std::endl;
  96. return twrc;
  97. }
  98. // 在此处将 imageData 数据保存到本地文件
  99. return twrc;
  100. }

上述代码中,我们首先初始化 TWAIN 应用程序并打开源管理器对话框。然后,获取默认源标识符并与设备建立连接。接下来,注册回调函数并设置扫描参数。通过启用源管理器用户界面来触发扫描操作。

在回调函数中,我们获取图像信息和原始图像数据,并将图像数据保存到本地文件。你可以在回调函数的最后一行添加适当的文件保存逻辑,根据需要更改保存路径和文件名。

请注意,TWAIN 2.4 是一个过时的接口版本,不再被官方推荐使用。建议使用更现代且支持更广泛的 TWAIN 接口版本或其他扫描解决方案。

希望这能对你有所帮助!


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=16661

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?