Получение EZTwain BARCODE_Recognize возвращаемого значения -4

Я пытаюсь использовать библиотеку сканирования 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.

Я передаю 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;
  }
}

Кто-нибудь знает, что означает этот код ошибки? И если да, то где вы узнали, что это значит?

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).

Эта ошибка просто означает, что произошла какая-то неопределенная ошибка памяти.

Другие вопросы по тегам