2

我正在使用以下代码来解码从相机拍摄的 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 图像时。所以有什么想法可能是错的???

非常感谢。

4

2 回答 2

2

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

于 2013-04-07T15:24:59.557 回答
1

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

于 2013-04-11T02:55:51.653 回答