Search code examples
objective-ciphoneios4barcode-scannerscanning

How do I use the scanCrop property of a ZBar reader?


I am using the ZBar SDK for iPhone in order to scan a barcode. I want the reader to scan only a specific rectangle instead of the whole view, for doing that it is needed to set the scanCrop property of the reader to the desired rectangle.

I'm having hard time with understanding the rectangle parameter that has to be set.

Can someone please tell me what rect should I give as an argument if on portrait view its coordinates would be: CGRectMake( A, B, C, D )?


Solution

  • From the zbar's ZBarReaderView Class documentation :

    CGRect scanCrop

    The region of the video image that will be scanned, in normalized image coordinates. Note that the video image is in landscape mode (default {{0, 0}, {1, 1}})

    The coordinates for all of the arguments is in a normalized float, which is from 0 - 1. So, in normalized value, theView.width is 1.0, and theView.height is 1.0. Therefore, the default rect is {{0,0},{1,1}}.

    So for example, if I have a transparent UIView named scanView as a scanning region for my readerView. Rather than do :

    readerView.scanCrop = scanView.frame;
    

    We should do this, normalizing every arguments first :

    CGFloat x,y,width,height;  
    x = scanView.frame.origin.x / readerView.bounds.size.width;
    y = scanView.frame.origin.y / readerView.bounds.size.height;
    width = scanView.frame.size.width / readerView.bounds.size.width;
    height = scanView.frame.size.height / readerView.bounds.size.height;
    
    readerView.scanCrop = CGRectMake(x, y, width, height);
    

    It works for me. Hope that helps.