ZBLOG

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

在TWAIN 2.4规范中,你可以使用twaindsm.dll来设置回调函数、扫描图片并将图片信息保存到本地。以下是一个基本的示例代码:

  1. #include <windows.h>
  2. #include <twain.h>
  3. // 定义回调函数
  4. TW_UINT16 FAR PASCAL TwainCallback(pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
  5. TW_UINT32 uiMsg, TW_MEMREF pData)
  6. {
  7. switch (uiMsg) {
  8. case MSG_XFERREADY: {
  9. // 接收图像数据
  10. pTW_IMAGEINFO pInfo = new TW_IMAGEINFO;
  11. // 获取图像信息
  12. TW_UINT16 status = DSM_Entry(&appID, &srcID, DG_IMAGE, DAT_IMAGEINFO,
  13. MSG_GET, (TW_MEMREF)pInfo);
  14. if (status == TWRC_SUCCESS) {
  15. // 保存图像到文件
  16. std::string filename = "image.jpg"; // 图像保存路径和文件名
  17. // 创建一个DIB(设备无关位图)
  18. HGLOBAL hDIB = GlobalAlloc(GHND | GMEM_SHARE, pInfo->ImageWidth * pInfo->ImageLength * 3);
  19. LPBYTE lpDIB = (LPBYTE)GlobalLock(hDIB);
  20. // 获取图像数据
  21. status = DSM_Entry(&appID, &srcID, DG_IMAGE, DAT_IMAGENATIVEXFER,
  22. MSG_GET, (TW_MEMREF)lpDIB);
  23. if (status == TWRC_SUCCESS) {
  24. // 将图像数据写入文件
  25. HANDLE hFile = CreateFileA(filename.c_str(), GENERIC_WRITE,
  26. FILE_SHARE_READ, NULL, CREATE_ALWAYS,
  27. FILE_ATTRIBUTE_NORMAL, NULL);
  28. if (hFile != INVALID_HANDLE_VALUE) {
  29. DWORD bytesWritten;
  30. WriteFile(hFile, lpDIB, pInfo->ImageWidth * pInfo->ImageLength * 3,
  31. &bytesWritten, NULL);
  32. CloseHandle(hFile);
  33. }
  34. }
  35. GlobalUnlock(hDIB);
  36. GlobalFree(hDIB);
  37. delete pInfo;
  38. }
  39. // 继续下一次扫描
  40. DSM_Entry(&appID, &srcID, DG_CONTROL, DAT_USERINTERFACE,
  41. MSG_ENABLEDSUIONLY, (TW_MEMREF)&ui);
  42. DSM_Entry(&appID, &srcID, DG_CONTROL, DAT_USERINTERFACE,
  43. MSG_ENABLEDSUIONLY, (TW_MEMREF)&ui);
  44. } break;
  45. // 其他回调消息处理
  46. default:
  47. break;
  48. }
  49. return TWRC_SUCCESS;
  50. }
  51. int main()
  52. {
  53. HWND hWnd = GetDesktopWindow(); // 获取窗口句柄
  54. TW_IDENTITY appID; // 应用程序标识
  55. memset(&appID, 0x00, sizeof(TW_IDENTITY));
  56. TW_UINT16 status = DSM_Entry(NULL, NULL, DG_CONTROL,
  57. DAT_PARENT | MSG_OPENDSM,
  58. (TW_MEMREF)&hWnd);
  59. if (status == TWRC_SUCCESS) {
  60. status = DSM_Entry(NULL,NULL,DG_CONTROL,DAT_IDENTITY,
  61. MSG_GETDEFAULT,(TW_MEMREF)&appID);
  62. if (status == TWRC_SUCCESS) {
  63. status = DSM_Entry(&appID,NULL,DG_CONTROL,DAT_USERINTERFACE,
  64. MSG_ENABLEDS,NULL);
  65. if (status == TWRC_SUCCESS) {
  66. pTW_EVENT twEvent = new TW_EVENT;
  67. // 设置回调函数
  68. twEvent->pfnDSMCallback = TwainCallback;
  69. // 打开数据源
  70. status = DSM_Entry(&appID,NULL,DG_CONTROL,DAT_IDENTITY,
  71. MSG_USERSELECT,(TW_MEMREF)NULL);
  72. if (status == TWRC_SUCCESS) {
  73. while (true) {
  74. // 处理消息循环,等待扫描完成的回调
  75. // 可以使用Sleep()或其他机制来降低CPU占用率
  76. }
  77. // 关闭数据源
  78. DSM_Entry(&appID, NULL, DG_CONTROL, DAT_PARENT,
  79. MSG_CLOSEDSM, (TW_MEMREF)&hWnd);
  80. }
  81. delete twEvent;
  82. }
  83. }
  84. // 关闭数据源管理器
  85. DSM_Entry(NULL, NULL, DG_CONTROL, DAT_PARENT | MSG_CLOSEDSM,
  86. (TW_MEMREF)&hWnd);
  87. }
  88. return 0;
  89. }

请注意,上述代码只是一个基本示例,具体的实现细节可能会因不同的设备驱动程序、编译环境和操作系统而有所变化。确保在使用之前先阅读并理解相关的TWAIN规范和文档,并根据你的需求进行相应的适配和调整。


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?