ZBLOG

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

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

#include <windows.h>
#include <iostream>
#include <vector>

// TWAIN 头文件
#include "twain.h"

// 回调函数
TW_UINT16 FAR PASCAL MyCallbackProc(pTW_IDENTITY pOrigin, pTW_IDENTITY pDest, TW_UINT32 data);

int main()
{
    // 初始化 TWAIN 应用程序
    HWND hwnd = GetDesktopWindow();
    TW_IDENTITY appId;
    memset(&appId, 0, sizeof(TW_IDENTITY));
    appId.Id = 0;
    appId.Version.MajorNum = 2;
    appId.Version.MinorNum = 4;
    appId.ProtocolMajor = TWON_PROTOCOLMAJOR;
    appId.ProtocolMinor = TWON_PROTOCOLMINOR;

    // 打开源管理器对话框
    TW_INT16 twrc = DSM_Entry(&appId, nullptr, DG_CONTROL, DAT_PARENT,
                              MSG_OPENDSM, (TW_MEMREF)&hwnd);
                              
	if (twrc != TWRC_SUCCESS) {
        std::cout << "打开源管理器失败" << std::endl;
        return -1;
	}

	// 获取默认源标识符
	TW_IDENTITY sourceId;
	twrc = DSM_Entry(&appId, nullptr, DG_CONTROL, DAT_IDENTITY,
	                 MSG_GETDEFAULT, (TW_MEMREF)&sourceId);

	if (twrc != TWRC_SUCCESS) {
		std::cout << "获取默认源标识符失败" << std::endl;
		return -1;
	}
	
	// 打开源,建立与设备的连接
	twrc = DSM_Entry(&appId, &sourceId, DG_CONTROL, DAT_IDENTITY,
	                 MSG_OPENDS, (TW_MEMREF)&sourceId);

	if (twrc != TWRC_SUCCESS) {
		std::cout << "打开源失败" << std::endl;
		return -1;
	}
	
	// 注册回调函数
	twrc = DSM_Entry(&appId, &sourceId, DG_CONTROL, DAT_CALLBACK,
	                 MSG_REGISTER_CALLBACK, (TW_MEMREF)&MyCallbackProc);
	
	if (twrc != TWRC_SUCCESS) {
	    std::cout << "注册回调函数失败" << std::endl;
	    return -1;
	}

    // 设置扫描参数
    TW_USERINTERFACE twUI;
    memset(&twUI, 0, sizeof(TW_USERINTERFACE));
    twUI.ShowUI = TRUE;  // 显示源管理器的用户界面
    twUI.ModalUI = TRUE; // 模态对话框方式显示

    twrc = DSM_Entry(&appId, &sourceId, DG_CONTROL, DAT_USERINTERFACE,
                     MSG_ENABLEDSUSERINTERFACE,(TW_MEMREF)&twUI);

	if (twrc != TWRC_SUCCESS) {
        std::cout << "设置扫描参数失败" << std::endl;
        return -1;
	}

	// 等待扫描完成,此处可根据需要添加超时机制或其他处理逻辑

	// 关闭源
	twrc = DSM_Entry(&appId, &sourceId, DG_CONTROL, DAT_IDENTITY,
	                 MSG_CLOSEDS,(TW_MEMREF)&sourceId);

	if (twrc != TWRC_SUCCESS) {
        std::cout << "关闭源失败" << std::endl;
        return -1;
	}

    // 关闭源管理器
	twrc = DSM_Entry(&appId, nullptr, DG_CONTROL, DAT_PARENT,
	                 MSG_CLOSEDSM,(TW_MEMREF)&hwnd);

	if (twrc != TWRC_SUCCESS) {
        std::cout << "关闭源管理器失败" << std::endl;
        return -1;
	}

	return 0;
}

// 回调函数
TW_UINT16 FAR PASCAL MyCallbackProc(pTW_IDENTITY pOrigin, pTW_IDENTITY pDest, TW_UINT32 data)
{
    // 获取图像数据并保存到本地文件
    TW_IMAGEINFO imageInfo;
    memset(&imageInfo, 0, sizeof(TW_IMAGEINFO));
    
    // 获取图像信息
    TW_INT16 twrc = DSM_Entry(nullptr, nullptr, DG_IMAGE,
                              DAT_IMAGEINFO, MSG_GET,&imageInfo);

	if (twrc != TWRC_SUCCESS) {
        std::cout << "获取图像信息失败" << std::endl;
        return TWRC_FAILURE;
	}
	
    // 分配缓冲区用于保存图像数据
    std::vector<TW_UINT8> imageData(imageInfo.ImageSize);
    
    // 获取图像数据
	twrc = DSM_Entry(nullptr,nullptr,DG_IMAGE,DAT_IMAGENATIVEXFER,
	                 MSG_GET,(TW_MEMREF)imageData.data());

	if (twrc != TWRC_XFERDONE) {
	    std::cout << "获取图像数据失败" << std::endl;
	    return twrc;
	}
	
	// 在此处将 imageData 数据保存到本地文件

	return twrc;
}

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

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

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

希望这能对你有所帮助!


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?