ZXingObjC无法解码从UIImagePickerController中获取的图像

时间:2013-03-22 16:39:37

标签: ios objective-c qr-code zxing

我正在使用以下代码解码从相机中取出的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];
}

但是,我收到一条错误消息,指出在Image上找不到条形码。另一方面,如果我使用像ZXingObjC提供的测试图像,它的工作原理,问题就在于尝试UIImagePickerController图像时。所以任何想法都可能出错???。

非常感谢。

2 个答案:

答案 0 :(得分:2)

我不熟悉ZXingObjC端口,所以YMMV。 zxing启发式算法已经在手机上的实时视频预览流提供的相对较低的图像上进行了调整。在现代手机上,从静态相机拍摄的图像具有非常高的分辨率......足够高,可以分辨LCD上的各个像素(至少2K显示器)。 zxing经常要求对这种高分辨率图像进行低通滤波。最简单的方法是对图像进行抽取/下采样。这是我从stil-camera图像解码时所做的事情:首先以原始分辨率尝试,然后抽取到1000x1000以下的东西。其中一种通常有效。

答案 1 :(得分:1)

只是对smparkes评论的更新是,通过简单地将UIImage大小减小到640x480,该库与UIImagePickerController生成的图像完美配合,至少在我的iPhone 5上。它每次都以这种方式抓取UPC代码。< / p>