我使用powerbuilder应用程序中的EZTWAIN从HP扫描仪获取图像。最近我尝试了一个柯达模型(i1120),似乎它不被支持。具体而言,应用程序在扫描过程中会冻结(可能问题与duplex
扫描有关)。Powerbuilder WebCam
您能否推荐您使用过的另一个库,并且可以为您工作,并为可从Powerbuilder使用的TWAIN API提供易于使用的包装?
我使用powerbuilder应用程序中的EZTWAIN从HP扫描仪获取图像。最近我尝试了一个柯达模型(i1120),似乎它不被支持。具体而言,应用程序在扫描过程中会冻结(可能问题与duplex
扫描有关)。Powerbuilder WebCam
您能否推荐您使用过的另一个库,并且可以为您工作,并为可从Powerbuilder使用的TWAIN API提供易于使用的包装?
查看该公司:http://www.data-tech.com/我们使用他们的ImageMan ActiveX套件与PB 10.5,它没有问题。
非常感谢。你是否用扫描器同时扫描页面的两侧来尝试它? – 2010-01-26 17:48:44
是的,我们有,去年实际实施,它像一个魅力。 – 2010-01-26 18:28:15
我注意到没有提供powerbuilder的代码示例。你有没有找到? – 2010-01-27 08:15:03
我有一个与多个库双面扫描类似的问题。解决方案是在使用双面扫描而不是ActiveX组件时直接使用扫描仪界面。大多数库都有一个可以随时启用的选项来使用扫描仪界面。
我目前使用Viscomsoft Scanner Pro ActiveX库。
我不同意,写了一个商业TWAIN库 - 如果你可以单向扫描而不是双面扫描,无论是否显示扫描仪的用户界面,那么在应用程序或库中都有代码问题,而且可能在图书馆。双面扫描(通过TWAIN)与单面扫描仅有细微的差别。 – Spike0xff 2013-01-24 16:42:49
**object : n_webcam**
================================================================================
forward
global type nvo_webcam from nonvisualobject
end type
end forward
global type nvo_webcam from nonvisualobject autoinstantiate
end type
prototype type
function ulong capCreateCaptureWindowA (string lpszWindowName, ulong dwStyle, long li_x, long li_y, long nWidth, long nHeight, ulong ParentWin, long nId) LIBRARY 'AVICAP32.DLL' alias for "capCreateCaptureWindowA; ansi"
Function ulong GetDC (ulong hWnd) Library "user32.dll"
Function long ReleaseDC (ulong hWnd, ulong hdcr) Library "USER32.DLL"
Function ulong CreateCompatibleDC (ulong hdc) Library "gdi32.dll"
Function ulong CreateCompatibleBitmap (ulong hdc, ulong nWidth, ulong nHeight) Library "gdi32.dll"
Function boolean DeleteDC (ulong hDC) Library "Gdi32.dll"
Function boolean BitBlt (ulong hdcDest, long nXDest, long nYDest, long nWidth, long nHeight, ulong hdcSrc, long nXSrc, long nYSrc, long dwRop) Library "gdi32.dll"
Function boolean StretchBlt (ulong hdcDest, long nXOriginDest, long nYOriginDest, long nWidthDest, long nHeightDest, ulong hdcSrc, long nXOriginSrc, longnYOriginSrc, long nWidthSrc, long nHeightSrc, long dwRop) Library "gdi32.dll"
Function ulong SelectObject (ulong hdc, ulong HGDIOBJ) Library "gdi32.dll"
Function along GetDIBits (ulong hdc, ulong hbmp, uint uStartScan, uint cScanLines, Ref blob lpvBits, Ref BITMAPINFO lpbi, uint uUsage) Library "gdi32.dll" alias for "GetDIBits"
Function long GetDIBits (ulong hdc, ulong hbmp, uint uStartScan , uint cScanLines, ulong lpvBits, ref bitmapinfo lpbi, uint uUsage) Library "gdi32.dll" alias for "GetDIBits"
Subroutine CopyBitmapFileHeader (Blob Ref Destination, bitmapfileheader Source, long Length) Library "kernel32.dll" Alias For "RtlMoveMemory" Subroutine CopyBitmapInfo (Blob Ref Destination, Source bitmapinfo, long Length) Library "kernel32.dll" Alias For "RtlMoveMemory"
Function boolean OpenClipboard (ulong hWndNewOwner) Library "user32.dll"
Function boolean CloseClipboard() Library "user32.dll"
Function boolean EmptyClipboard() Library "user32.dll"
Function ulong GetClipboardData (ulong uFormat) Library "user32.dll"
end prototypes
such variables
Uint LHand
Constant long GET_FRAME = 1084
Constant long COPY = 1054
Constant long WM_USER = 1024
Constant long WM_CAP_START = WM_USER
Constant long WM_CAP_STOP = WM_CAP_START + 68
Constant long WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10
Constant long WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11
Constant long WM_CAP_SAVEDIB = WM_CAP_START + 25
Constant Long WM_CAP_GRAB_FRAME = WM_CAP_START + 60
Constant LongWM_CAP_SEQUENCE = WM_CAP_START + 62
Constant long WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20
Constant long WM_CAP_FILE_SAVEAS = WM_CAP_START + 23
Constant long WM_CAP_SEQUENCE_NOFILE = WM_CAP_START + 63
Constant long WM_CAP_SET_OVERLAY = WM_CAP_START + 51
Constant long WM_CAP_SET_PREVIEW = WM_CAP_START + 50
Constant long WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START +6
Constant long WM_CAP_SET_CALLBACK_ERROR = WM_CAP_START + 2
Constant Long WM_CAP_SET_CALLBACK_STATUSA = WM_CAP_START +3
Long Constant WM_CAP_SET_CALLBACK_FRAME = WM_CAP_START +5
Long Constant WM_CAP_SET_SCALE = WM_CAP_START + 53
Long Constant WM_CAP_SET_PREVIEWRATE = WM_CAP_START + 52
end variables
forward prototypes
public subroutine of_close()
public subroutine of_initialize_webcam (unsignedlong a_handle, string a_title, integer a_width, integer a_height)
public function blob of_copy_clipboard_to_blob()
public subroutine of_capture_pic()
end prototypes
public subroutine of_close(); send (lhand, WM_CAP_DRIVER_DISCONNECT, 0, 0)
end subroutine
public subroutine of_initialize_webcam (unsigned long a_handle, string a_title, integer a_width, integer a_height); string lpszName
lpszName = a_title
if lhand = 0 then
lhand = capCreateCaptureWindowA (lpszName, 262144 + 12582912 + 1073741824 + 268435456, 1.40, a_width, a_height, a_handle, 0)
end if
if lhand <> 0 then
send (lhand, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0)
send (lhand, WM_CAP_SET_CALLBACK_ERROR, 0, 0)
send (lhand, WM_CAP_SET_CALLBACK_STATUSA, 0, 0)
send (lhand, WM_CAP_DRIVER_CONNECT, 0, 0)
send (lhand, WM_CAP_SET_SCALE, 1, 0)
send (lhand, WM_CAP_SET_PREVIEWRATE, 66, 0)
send (lhand, WM_CAP_SET_OVERLAY, 1, 0)
send (lhand, WM_CAP_SET_PREVIEW, 1, 0)
end if
end subroutine
public function blob of_copy_clipboard_to_blob(); BitmapInfo lstr_Info
BitmapFileHeader lstr_Header
Blob lblb_header, lblb_info, lblb_bitmap, lbl_final
ULong lul_hdc, lul_hdcMem, lul_hBitmap, lul_hWnd, lul_blpos
UInt DIB_RGB_COLORS
Integer li_pixels
Boolean lb_result
long al_width, ll_height, ll_ret
constant integer BITMAPTYPE = 19778 // 4D42 = BM
constant integer CF_BITMAP = 2
constant integer CF_DIB = 8
lul_hWnd = Handle (this)
lb_result = OpenClipboard (lul_hWnd)
// Get the device context and allocate memory
lul_hdc = GetDC (lul_hWnd)
lul_hdcMem = CreateCompatibleDC (lul_hdc)
lul_hBitmap = getclipboarddata (CF_BITMAP)
// try to store the bitmap into a blob so we can save it
lstr_Info.bmiHeader.biSize = 40
ll_height = 480 // ... 480 should be enough for everyone? ;)
DIB_RGB_COLORS = 0
// Get the bitmapinfo
If GetDIBits (lul_hdcMem, lul_hBitmap, 0, ll_height, 0, lstr_Info, DIB_RGB_COLORS)> 0 Then
li_pixels = lstr_Info.bmiHeader.biBitCount
lstr_Info.bmiColors [li_pixels] = 0
lblb_bitmap = Blob (Space (lstr_Info.bmiHeader.biSizeImage), EncodingANSI!)
ll_height = lstr_Info.bmiHeader.biheight
// get the actual bits
ll_ret = GetDIBits (lul_hdcMem, lul_hBitmap, 0, ll_height, lblb_bitmap, lstr_Info, DIB_RGB_COLORS)
// ls_msg = hexdump_blob (lblb_bitmap, false)
// create a bitmap header
lstr_Header.bfType = BITMAPTYPE
lstr_Header.bfSize = lstr_Info.bmiHeader.biSizeImage
lstr_Header.bfOffBits = 54 + (li_pixels * 4)
// copy the header structure to a blob
lblb_header = Blob (Space (7)) //
14/2 CopyBitmapFileHeader (lblb_header, lstr_Header, 14)
// copy the info structure to a blob
lblb_Info = Blob (Space (40 + li_pixels * 4)/2))
CopyBitmapInfo (lblb_Info, lstr_Info, len (lblb_Info))
// add all together and we have a window bitmap in a blob
lbl_final = lblb_header + lblb_info + lblb_bitmap
End If
CloseClipboard()
ReleaseDC (lul_hwnd, lul_hdc)
DeleteDC (lul_hdcMem)
return lbl_final
end function
public subroutine of_capture_pic(); Send (lhand, GET_FRAME, 0, 0)
Send (lhand, COPY, 0, 0)
end subroutine
we have nvo_webcam. create
call super :: create
TriggerEvent (this , "constructor")
end on
we have nvo_webcam. destroy
TriggerEvent (this , "destructor")
call super :: destroy
end on
**instantiate the object and initialize it:**
================================================================================
n_webcam.of_initialize_webcam (handle (this), "Webcam" , il_width, il_height)
**capture:**
================================================================================
n_webcam.of_capture_pic()
**image processing:**
================================================================================
lb_blob = n_webcam..of_copy_clipboard_to_blob()
// reinitialize for the webcam to continue live
i_nvo_webcam.of_initialize_webcam (handle (this), "Webcam" , il_width, il_height)
**Close:**
================================================================================
n_webcam.of_close()
欢迎帖子链接;但是,请避免主要通过链接或链接转播。链接可以及时更改或变得不可用,如果链接后的信息将被更改或删除,请在您的帖子中描述您的想法。请描述更多你的代码如何回答这个问题 – 2017-10-27 09:48:45
经过调查问题曾与我以前跳过空白页的方式做。 (请参阅第21页,这里http://www.dosadi.com/pub/eztp/EZTwain_User_Guide.pdf) 我正在使用TWAIN_BeginMultipageFile和Do循环。当我将其更改为TWAIN_AcquireMultipageFile和TWAIN_SetBlankPageMode(1)时,问题解决了。您也可以使用TWAIN_SetBlankPageThreshold来调整页面的“暗像素”比例,将其视为“空白”。最终我决定完全跳过空白页面的省略。虽然我没有那个柯达模型了,但我相信它没有问题。 – 2010-03-04 16:18:05
EZTwain在2011年1月由Atalasoft(现为Kofax的一部分)购买,但Atalasoft继续为授权的EZTwain开发人员提供电子邮件和论坛支持。他们有一个很棒的支持团队。 (是的,我为他们工作;-) – Spike0xff 2013-01-24 16:47:57