2011-08-07 27 views
8

Używam zestawu SDK ZBar dla iPhone'a w celu zeskanowania kodu kreskowego. Chcę, aby czytnik skanował tylko konkretny prostokąt zamiast całego widoku, ponieważ konieczne jest ustawienie właściwości scanCrop czytnika w pożądanym prostokącie.Jak korzystać z właściwości scanCrop czytnika ZBar?

Mam trudności ze zrozumieniem parametru prostokąta, który należy ustawić.

Czy ktoś może mi powiedzieć, co powinienem podać jako argument, jeśli w widoku pionowym jego współrzędne będą następujące: CGRectMake(A, B, C, D)?

Odpowiedz

23

Od zbar na ZBarReaderView Class documentation:

CGRect scanCrop

Region obrazu wideo, które będą skanowane w znormalizowanego obrazu współrzędne. Zauważ, że obraz wideo jest w trybie poziomym (domyślnie {{0, 0}, {1, 1}})

Współrzędne dla wszystkich argumentów jest w znormalizowanej pływaka, który wynosi od 0 - 1 Tak więc, w znormalizowanej wartości, theView.width wynosi 1.0, a theView.height jest 1.0. Dlatego domyślny rect to {{0,0}, {1,1}}.

Na przykład, jeśli mam przezroczysty UIView o nazwie scanView jako region skanowania dla mojego readerView. Zamiast zrobić:

readerView.scanCrop = scanView.frame; 

Powinniśmy to zrobić, normalizowanie co argumenty pierwszy:

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

To działa na mnie. Nadzieja, która pomaga.

+1

Chciałabym upvote cię dwa razy, dzięki! – chourobin

+1

Jeśli Twój czytnik będzie portretem, a nie pejzażem, zobacz [ten post] (http://stackoverflow.com/a/11732752/542400) – AMayes

3

Możesz użyć obszaru przycięcia skanowania, wykonując to. reader.scanCrop = CGRectMake(x,y,width,height); dla np. reader.scanCrop = CGRectMake(.25,0.25,0.5,0.45); Użyłem tego i działa dla mnie.

1

! to jest właściwy sposób na dostosowanie obszaru uprawy;

Zmarnowałem na nim mnóstwo czasu;

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); }