2013-06-10 2 views
1

EZTwain 스캐닝 라이브러리를 사용하여 스캔 한 이미지에서 바코드를 검색하려고하는데 EZTwain.BARCODE_Recognize(IntPtr, int, int)에 전화하려고하면 반환 값 -4가 표시됩니다. EZTwain 사용자 가이드에 대한 설명이 없습니다. EZTwain 사용 설명서의 EZTwain 가져 오기 BARCODE_4 반환 값 확인

, 그것은
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 반환이 없습니다 오류 코드로 as you can see here.

BARCODE_Recognize

을 사용하는 일부 반환 값을 나열하고 어디서 모른다 다른 방법으로는이 라이브러리의 설명서에 사용할 수있는 유일한 사용자 안내서가 있기 때문입니다.

이것은 -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.

나는 이미지를 사용하여 만들고, 모든 바코드 유형을 사용하여 이미지의 모든 바코드를 찾으려면 -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. -4 반환 코드가 문서화 된 EZTwain 툴킷의 최신 버전이 있습니다. 하지만 "메모리 오류 (메모리 부족)"라고 표시됩니다.이 경우에는별로 도움이되지 않습니다! Atalasoft는 eztwain.com에서 업데이트 된 툴킷을 사용할 수있게하고, 유효한 EZTwain Pro 3 라이센스는 툴킷의 이후 버전 3.x에서도 계속 작동 할 것입니다.

  2. 이미지 매개 변수 EZTwain은 (단지 API의 모든 곳에서) 단지 '이미지 핸들'이 아니라 구체적으로 정확하게는 압축 된 DIB를 포함하는 메모리 블록에 대한 전체 핸들 인 HDIB = Device Independent 비트 맵. 이것들은 모두 Win32 API의 옛날 것들이며, EZTwain은이 특정 조합 만 이해할 수 있습니다. IntPtr로 표현 된 것을 보아 혼동하지 마십시오. IntPtr은 모든 종류의 서로 다른 기본 객체를 보유 할 수 있습니다. GetHBitmap은 HDIB를 반환하지 않지만 이전 Windows API가 HBITMAP이라고하는 객체는 혼동을 일으킬 정도로 유사하며 HDIB와는 완전히 호환 할 수 없다고 생각합니다.

  3. EZTwain에는 HBITMAP과 같은 다른 종류의 메모리 내장 이미지 형식과의 변환을위한 여러 가지 기능이 포함되어 있습니다. 나는 심지어 툴킷의 최근 버전에서 eztwain.cs 파일이 System.Drawing.Bitmap을 이동하는 몇 가지 기능을 가지고 있다고 생각한다. < ==> HDIB (System.IntPtr로 표현됨).

+0

1- 우리는 3을 고수해야한다고 생각합니다.30 버전을 사용하고 있습니다. 고객 컴퓨터에 설치된 EZTwain 라이브러리 버전을 사용하는 다른 제품이 있으므로, 3.43 버전을 설치하면이 제품이 계속 작동 할 것인지는 잘 모르겠습니다. 2 - 나는 IntPtr이 무엇인지 이제 이해한다. 특히 객체 유형이 아니라 메모리 위치에 대한 포인터입니다. GetHBitmap 메서드는 GDI 비트 맵을 반환하지만 이는 IntPtr로 표현됩니다.이 메서드는 DIB_FromBitmap에 전달하여 HDIB eztwain이 바코드를 인식 할 때 원하는 결과를 얻을 수 있습니다. 이제 어쨌든 작동합니다 .. – Zack

+0

3 Page 49 http://www.dosadi.com/pub/eztp/EZTwain_User_Guide.pdf, 2 번 항목은 "EZTwain이 DIB (HBITMAP)에서 DIB_FromBitmap으로 DIB로 변환 할 수 있음"을 말합니다. 따라서 우리는 GetHBitmap을 사용하여 해당 HBITMAP 포인터를 가져 와서 BARCODE_Recognize로 전달합니다. – Zack

+1

나에게 맞는 소리. 다시 업그레이드 : EZTwain의 이후 버전 3.x는 3.30 버전의 드롭 인 대체품이어야합니다. 물론 프로덕션 배포의 경우에도 한 대의 컴퓨터에서 먼저 검사 한 다음 두 개 이상의 스캐너를 사용하는 경우 각 모델의 스캐너에서 테스트 할 책임이 있습니다. 그러나 우리는 마이너 버전 단계에서 작업중인 고객 코드를 절대로 깨뜨리지 않도록 노력하고 있습니다. – Spike0xff

0

이 오류는 일종의 지정되지 않은 메모리 오류가 있었음을 의미합니다.

관련 문제