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

3

9

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

Forevermore answered 7/8, 2011 at 2:33 Comment(0)
D
24

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.

Depoliti answered 10/9, 2011 at 12:36 Comment(1)
If your reader is going to be in portrait instead of landscape, see this postExceedingly
S
3

You can use scan crop area by doing this. reader.scanCrop = CGRectMake(x,y,width,height); for eg. reader.scanCrop = CGRectMake(.25,0.25,0.5,0.45); I used this and its working for me.

Syntax answered 30/12, 2013 at 14:25 Comment(0)
M
1

come on!!! this is the right way to adjust the crop area;

I had wasted tons of time on it;

readerView.scanCrop = [self getScanCrop:cropRect readerViewBounds:contentView.bounds]; - (CGRect)getScanCrop:(CGRect)rect readerViewBounds:(CGRect)rvBounds{ CGFloat x,y,width,height; x = rect.origin.y / rvBounds.size.height; y = 1 - (rect.origin.x + rect.size.width) / rvBounds.size.width; width = rect.size.height / rvBounds.size.height; height = rect.size.width / rvBounds.size.width; return CGRectMake(x, y, width, height); }

Marentic answered 20/9, 2016 at 10:55 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.