1

我正在尝试使用 EZTwain 扫描库从扫描的图像中检索条形码,当我尝试调用时,我得到的返回值为 -4 EZTwain.BARCODE_Recognize(IntPtr, int, int),在 EZTwain 用户指南中没有描述。

在 EZTwain 用户指南中,它列出了一些用作错误代码的返回值,如您在此处看到的。

BARCODE_Recognize

int BARCODE_Recognize(HDIB hdib, int nMaxCount, int nType)
Find and recognize barcodes in the given image.
Don't look for more than nMaxCount barcodes (-1 means 'any number').
Expect barcodes of the specified type (-1 means 'any supported type')
You can add or 'or' together barcode types, to tell the recognizer to look for more
than one symbology. Return values:
   >0 n barcodes found
   0 no barcodes found
   -1 barcode services not available.
   -3 invalid or null image

没有列出 -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.

我通过IntPtri 创建使用图像和 -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;
  }
}

有谁知道这个错误代码是什么意思?如果是这样,您从哪里发现它的含义?

4

2 回答 2

2

扎克,你可能已经想通了。对于未来的读者:

  1. 有一个更新版本的 EZTwain 工具包,其中记录了 -4 返回码。但是,它只是说“内存错误(内存不足?)”——在这种情况下仍然不是很有帮助!Atalasoft 在 eztwain.com 上提供了更新的工具包,任何有效的 EZTwain Pro 3 许可证都将继续与这些工具包的 3.x 版本一起使用。

  2. EZTwain 期望的图像参数(在其 API 中几乎无处不在)不仅是一个“图像句柄”,而且特别是一个 HDIB,它是一个包含打包 DIB = 设备独立位图的内存块的全局句柄。这些都是来自 Win32 API 的古老事物,只有特定的组合才能被 EZTwain 理解。不要因为看到这些表示为 IntPtr 而感到困惑 - IntPtr 可以容纳各种不同的底层原生对象。我猜 GetHBitmap 不会返回 HDIB,而是旧 Windows API 称为 HBITMAP 的对象,这听起来令人困惑,并且与 HDIB 完全不可互换。

  3. EZTwain 包含许多用于与其他类型的内存图像格式(例如 HBITMAP)进行相互转换的函数。我什至认为在工具包的最新版本中,eztwain.cs 文件具有一些往返于 System.Drawing.Bitmap <==> HDIB(表示为 System.IntPtr)的函数。

于 2013-07-25T21:19:27.090 回答
0

该错误仅意味着存在某种未指定的内存错误。

于 2013-07-25T20:43:44.760 回答