Получение 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 ответа
Зак, ты, наверное, уже понял это. Для будущих читателей:
Существует более новая редакция инструментария EZTwain, в которой задокументирован этот код возврата -4. Но он просто говорит "ошибка памяти (недостаточно памяти?)" - все равно не очень помогает в этом случае! Atalasoft делает обновленный инструментарий доступным на eztwain.com, и любая действующая лицензия EZTwain Pro 3 будет продолжать работать с этими более поздними версиями инструментария 3.x.
Этот параметр изображения, который ожидает EZTwain (почти везде в его API), является не просто "дескриптором изображения", а конкретно и точно HDIB, который является глобальным дескриптором блока памяти, содержащего упакованный DIB = независимый от устройства битовый образ. Все это древние вещи из Win32 API, и только эта конкретная комбинация понятна EZTwain. Не смущайтесь, видя, что они представлены как IntPtr - IntPtr может содержать все виды различных базовых нативных объектов. Я бы предположил, что GetHBitmap не возвращает HDIB, а объект, который старый Windows API называл HBITMAP, который звучит до смешения и совершенно не взаимозаменяем с HDIB.
EZTwain включает в себя ряд функций для преобразования в и из других форматов изображений в памяти, таких как HBITMAP. Я даже думаю, что в последних выпусках инструментария файл eztwain.cs имеет некоторые функции, которые идут в и из System.Drawing.Bitmap <==> HDIB (представлен как System.IntPtr).
Эта ошибка просто означает, что произошла какая-то неопределенная ошибка памяти.