ZXingObjC не может декодировать изображение, взятое из UIImagePickerController

Я использую следующий код для декодирования QRCode, взятого с камеры.

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{  
originalImage = (UIImage *) [info objectForKey:
                             UIImagePickerControllerEditedImage];

ZXQRCodeReader *reader = [[ZXQRCodeReader alloc]init];

 ZXLuminanceSource *source = [[ZXCGImageLuminanceSource alloc] initWithCGImage:[originalImage CGImage]];
ZXHybridBinarizer *binazer = [ZXHybridBinarizer binarizerWithSource:source];
ZXBinaryBitmap *bitmap = [[ZXBinaryBitmap alloc]initWithBinarizer:binazer];

NSError *error;
ZXResult *result = [reader decode:bitmap
                            hints:nil
                            error:&error];
if(result){
    [[[UIAlertView alloc] initWithTitle:@"Success" message:@"Success"
                               delegate:nil
                      cancelButtonTitle:@"OK"
                      otherButtonTitles:nil, nil] show];
} else {
    // Use error to determine why we didn't get a result, such as a barcode
    // not being found, an invalid checksum, or a format inconsistency.
    [[[UIAlertView alloc] initWithTitle:@"ERROR" message:[error localizedDescription]
                               delegate:nil
                      cancelButtonTitle:@"OK"
                      otherButtonTitles:nil, nil] show];
}

Однако я получаю сообщение об ошибке, в котором говорится, что на изображении не найден штрих-код. С другой стороны, если я использую тестовые изображения, подобные предоставленным ZXingObjC, это работает, проблема заключается только в том, что я пытаюсь использовать изображения UIImagePickerController. Итак, любые идеи, что может быть не так???.

Большое спасибо.


person Pablo    schedule 22.03.2013    source источник
comment
Убедитесь, что исходное изображение и растровое изображение не равны нулю   -  person Midhun MP    schedule 22.03.2013


Ответы (2)


Я не очень хорошо знаком с портом ZXingObjC, так что YMMV. Эвристика zxing была настроена на изображения с относительно низким разрешением, которые обеспечивают потоки предварительного просмотра видео в реальном времени на телефонах. На современных телефонах изображение, снятое с фотокамеры, имеет очень высокое разрешение... достаточно высокое, чтобы можно было разрешить отдельные пиксели с ЖК-дисплея (по крайней мере, до дисплеев 2K). Zxing часто требует, чтобы такие изображения с высоким разрешением подвергались низкочастотной фильтрации. Самый простой способ сделать это — уменьшить/уменьшить размер изображения. Вот что я делаю, когда декодирую изображение со стилизованной камеры: сначала пробую его с родным разрешением, а затем децимирую до чего-то меньшего, чем 1000x1000. То одно, то другое обычно работает.

person smparkes    schedule 07.04.2013

Простое обновление к комментарию smparkes заключается в том, что, просто уменьшив размер UIImage, скажем, до 640x480, библиотека отлично работает с изображениями, сгенерированными UIImagePickerController, по крайней мере, на моем iPhone 5. Таким образом, она каждый раз захватывает коды UPC.

person earthtrip    schedule 11.04.2013
comment
Правильно, сканирование ZXing с изображения не идеально. Я использую несколько предопределенных разрешений для масштабирования изображения. NSArray *sizes = @[[NSValue valueWithCGSize:CGSizeMake(480.f, 480.f)], [NSValue valueWithCGSize:CGSizeMake(640.f, 640.f)],[NSValue valueWithCGSize:CGSizeMake(640.f, 480.f)]]; for (NSValue *value in sizes) {//scale to value.CGSizeValue and decode}; - person SoftDesigner; 27.11.2014