我试图使用EZTwain扫描库从扫描图像中检索条形码,当我尝试调用EZTwain.BARCODE_Recognize(IntPtr, int, int)
时,我得到了-4的返回值,在EZTwain用户指南中没有描述。
在EZTwain用户指南中,它列出了一些作为错误码使用的返回值,如您在这里看到的。
<标题> BARCODE_Recognize h1> 有列出-4返回值,我不知道还能去哪里找,因为用户指南是我所知道的唯一可用于该库文档的东西。这是我得到-4返回的代码时使用的代码。
我确实调用了EZTwain_SetVendorKey,但出于明显的原因没有调用。
我想知道它是否与我正在通过的IntPtr
有关?文档显示Call BARCODE_Recognize, passing it the handle of the image to search, the
maximum number of barcode patches to find, and a mask of the barcode
types (symbologies) to look for. If this function finds any barcodes, it returns
a positive integer = the count of symbols (barcodes) found.
我传递我使用图像创建的IntPtr
,并使用-1,-1查找图像中的所有条形码,使用所有条形码类型。
public static string GetBarcode(Bitmap image, out BarcodeType barcodeType, int percentThatCanBeNonWhitish = 2, int pixelTolerance = 10)
{
// initialize barcodeType to appease the compiler
barcodeType = BarcodeType.NotBarcode;
BitmapData bd = image.LockBits(new Rectangle(0, 0, image.Width, image.Height),
ImageLockMode.ReadWrite,
image.PixelFormat);
List<string> barcodes = new List<string>();
EZTwain.BARCODE_SelectEngine(EZTwain.EZBAR_ENGINE_DOSADI);
EZTwain.BARCODE_SetDirectionFlags(EZTwain.EZBAR_HORIZONTAL | EZTwain.EZBAR_VERTICAL);
IntPtr imgPtr = image.GetHbitmap();
if (EZTwain.DIB_IsBlank(imgPtr, .002) == true)
{
// Do nothing, the page is blank
}
else if (EZTwain.BARCODE_IsEngineAvailable(EZTwain.EZBAR_ENGINE_DOSADI))
{
int count;
count = EZTwain.BARCODE_Recognize(imgPtr, -1, -1);
for (int i = 0; i < count; i++)
{
barcodes.Add(EZTwain.BARCODE_Text(i));
}
}
if (barcodes.Count != 0)
{
string barcode = barcodes[0];
// sets the type to coversheet if it is blank, else it uses ProcessBarcodeType()
barcodeType = image.IsBlank(percentThatCanBeNonWhitish, pixelTolerance) ? BarcodeType.CoversheetBarcode : ProcessBarcodeType(barcode);
return barcode;
}
else
{
return null;
}
}
有人知道这个错误代码是什么意思吗?如果是的话,你从哪里发现它的含义的?
标题>Zack,你可能已经明白了。给将来的读者:
-
有一个更新版本的EZTwain工具包,其中记录了-4返回代码。但是,它只是说"内存错误(低内存?)"-在这种情况下仍然不是很有帮助!Atalasoft在eztwain.com上提供了更新的工具包,任何有效的EZTwain Pro 3许可证将继续与以后的3一起工作。
-
EZTwain期望的图像参数(在其API中几乎无处不在)不仅仅是一个"图像句柄",而是具体和精确地HDIB,这是一个全局句柄到一个内存块,包含一个打包的DIB =设备独立位图。这些都是来自Win32 API的古老的东西,只有特定的组合才能被EZTwain理解。不要因为看到它们被表示为IntPtr而感到困惑——IntPtr可以保存各种不同的底层本机对象。我猜GetHBitmap不返回HDIB,而是一个旧的Windows API称为HBITMAP的对象,这听起来令人困惑的相似,完全不能与HDIB互换。
-
EZTwain包含许多函数用于转换和从其他类型的内存图像格式,如HBITMAP。我甚至认为在工具包的最新版本中,eztwin .cs文件有一些函数可以从System.Drawing.Bitmap <==> HDIB(表示为System.IntPtr)。
该错误仅表示存在某种未指定的内存错误。