Мне удалось это сделать. Если кому-то нравится знать:
QCAR работает только с полным доступом к камере. Следовательно, он должен быть инициализирован и запущен, как показано в документации. К счастью, он обеспечивает доступ к обработанному изображению с камеры в виде необработанных данных RGB. Я использовал этот код для преобразования необработанных данных в UIImage:
QCAR::setFrameFormat(QCAR::GRAYSCALE, true);
const QCAR::Image *image = state.getFrame().getImage(1); // 0: YUV, 1: Grayscale image
const char *data = (const char *)image->getPixels();
int width = image->getWidth(); int height = image->getHeight();
CGColorSpace *colorSpace = CGColorSpaceCreateDeviceGray();
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
CGDataProvider *provider = CGDataProviderCreateWithData(NULL, data, width*height, NULL);
CGColorRenderingIntent intent = kCGRenderingIntentDefault;
CGImageRef imageRef = CGImageCreate(width, height, 8, 8, width * 1, colorSpace, bitmapInfo, provider, NULL, NO, intent);
myUIImage = [UIImage imageWithCGImage:imageRef];
Теперь вы можете использовать класс ZBar ZBarImageScanner следующим образом:
ZBarImageScanner *imageScanner = [[ZBarImageScanner alloc] init];
ZBarImage *image = [[ZBarImage alloc] initWithCGImage:myUIImage.CGImage];
int result = [imageScanner scanImage:image];
if (result > 0) {
ZBarSymbolSet *symbols = imageScanner.results;
for(ZBarSymbol *symbol in symbols) {
NSLog(@"%@", symbol.data);
}
}