qt 实现twain
QT可以使用TWAIN接口来实现扫描仪的扫描功能。以下是实现TWAIN接口的步骤:
1.下载TWAIN SDK(开发工具包)并安装。
2.在QT项目中添加TWAIN头文件和库文件。
3.定义TWAIN结构体和函数指针。
4.初始化TWAIN接口。
5.设置扫描仪参数。
6.启动扫描仪。
7.接收扫描仪数据并保存到文件中。
以下是一个简单的QT TWAIN实现示例:
#include <qtgui>
#include <twain.h>
//定义TWAIN结构体和函数指针
typedef struct {
TW_UINT16 MajorNum;
TW_UINT16 MinorNum;
TW_UINT16 Language;
TW_UINT16 Country;
char Info[34];
}TW_IDENTITY, *pTW_IDENTITY;
typedef TW_UINT16 (CALLBACK* DSM_Entry)(pTW_IDENTITY, pTW_IDENTITY, TW_UINT32, TW_UINT16, TW_UINT16, pTW_MEMREF);
//初始化TWAIN接口
HINSTANCE hDLL = LoadLibrary(TEXT("twain_32.dll"));
DSM_Entry pDSM_Entry = (DSM_Entry)GetProcAddress(hDLL, "DSM_Entry");
//设置扫描仪参数
TW_USERINTERFACE twUI;
memset(&twUI, 0, sizeof(TW_USERINTERFACE));
twUI.ShowUI = TRUE;
twUI.ModalUI = TRUE;
//启动扫描仪
TW_CAPABILITY twCap;
memset(&twCap, 0, sizeof(TW_CAPABILITY));
twCap.Cap = ICAP_XRESOLUTION;
twCap.ConType = TWON_ONEVALUE;
twCap.hContainer = GlobalAlloc(GHND, sizeof(TW_ONEVALUE));
TW_ONEVALUE *pXRes = (TW_ONEVALUE*)GlobalLock(twCap.hContainer);
pXRes->ItemType = TWTY_FIX32;
pXRes->Item = 300;
GlobalUnlock(twCap.hContainer);
pDSM_Entry(NULL, NULL, DG_CONTROL, DAT_CAPABILITY, MSG_SET, (TW_MEMREF)&twCap);
twCap.Cap = ICAP_YRESOLUTION;
twCap.ConType = TWON_ONEVALUE;
twCap.hContainer = GlobalAlloc(GHND, sizeof(TW_ONEVALUE));
TW_ONEVALUE *pYRes = (TW_ONEVALUE*)GlobalLock(twCap.hContainer);
pYRes->ItemType = TWTY_FIX32;
pYRes->Item = 300;
GlobalUnlock(twCap.hContainer);
pDSM_Entry(NULL, NULL, DG_CONTROL, DAT_CAPABILITY, MSG_SET, (TW_MEMREF)&twCap);
//接收扫描仪数据并保存到文件中
TW_IMAGEINFO twImageInfo;
memset(&twImageInfo, 0, sizeof(TW_IMAGEINFO));
TW_MEMREF hBitmap = NULL;
TW_PENDINGXFERS twPendingXfers;
memset(&twPendingXfers, 0, sizeof(TW_PENDINGXFERS));
TW_UINT16 twRC = pDSM_Entry(NULL, NULL, DG_CONTROL, DAT_USERINTERFACE, MSG_ENABLEDS, (TW_MEMREF)&twUI);
if (twRC == TWRC_SUCCESS) {
twRC = pDSM_Entry(NULL, NULL, DG_CONTROL, DAT_PENDINGXFERS, MSG_ENDXFER, (TW_MEMREF)&twPendingXfers);
if (twRC == TWRC_SUCCESS) {
twRC = pDSM_Entry(NULL, NULL, DG_IMAGE, DAT_IMAGEINFO, MSG_GET, (TW_MEMREF)&twImageInfo);
if (twRC == TWRC_SUCCESS) {
char szFilePath[MAX_PATH] = "";
sprintf(szFilePath, "image_%d.bmp", twPendingXfers.Count);
HANDLE hFile = CreateFile(szFilePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE) {
BITMAPFILEHEADER bmfHeader;
BITMAPINFOHEADER bi;
DWORD dwWritten;
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = twImageInfo.ImageWidth;
bi.biHeight = twImageInfo.ImageLength;
bi.biPlanes = 1;
bi.biBitCount = 24;
bi.biCompression = BI_RGB;
bi.biSizeImage = ((bi.biWidth * bi.biBitCount + 31) & ~31) / 8 * bi.biHeight;
bmfHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + bi.biSize;
bmfHeader.bfSize = bmfHeader.bfOffBits + bi.biSizeImage;
bmfHeader.bfType = 0x4D42;
WriteFile(hFile, (LPSTR)&bmfHeader, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
WriteFile(hFile, (LPSTR)&bi, sizeof(BITMAPINFOHEADER), &dwWritten, NULL);
WriteFile(hFile, (LPSTR)GlobalLock(hBitmap), bi.biSizeImage, &dwWritten, NULL);
GlobalUnlock(hBitmap);
CloseHandle(hFile);
}
}
}
}
pDSM_Entry(NULL, NULL, DG_CONTROL, DAT_USERINTERFACE, MSG_DISABLEDS, (TW_MEMREF)&twUI);
原文地址: https://www.cveoy.top/t/topic/bqv6 著作权归作者所有。请勿转载和采集!