Я пытаюсь сканировать QR-изображения, которые пользователь выбирает с диска. Я обнаружил странную проблему, из-за которой все библиотеки, которые я пробовал, не удались (старый порт CIDetector для ZXING или ZBAR). Я знаю, что есть способы добавить белый фон (например, перерисовать изображение или использовать CIFilter), чтобы изображение сканировалось.
Как правильно сканировать QR-коды с прозрачным фоном (настроить CIContext или CIDetector). (изображение ниже не сканируется на iOS и macOS).
https://en.wikipedia.org/wiki/QR_code#/media/File:QR_code_for_mobile_English_Wikipedia.svg
- (void)scanImage:(CIImage *)image
{
NSArray <CIFeature *>*features = [[self QRdetector] featuresInImage:image];
NSLog(@"Number of features found: %lu", [features count]);
}
- (CIDetector *)QRdetector
{
CIContext *context = [CIContext contextWithOptions:@{kCIContextWorkingColorSpace : [NSNull null]}]; //no difference using special options or nil as a context
CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:context options:@{CIDetectorAccuracy : CIDetectorAccuracyHigh, CIDetectorAspectRatio : @(1)}];
return detector;
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSURL *URL = [[NSBundle mainBundle] URLForResource:@"transparentqrcode" withExtension:@"png"];
UIImage *image = [UIImage imageWithContentsOfFile:[URL path]];
CIImage *ciImage = [CIImage imageWithContentsOfURL:URL];
//CUSTOM CODE TO ADD WHITE BACKGROUND
CIFilter *filter = [CIFilter filterWithName:@"CISourceAtopCompositing"];
[filter setDefaults];
CIColor *whiteColor = [[CIColor alloc] initWithColor:[UIColor whiteColor]];
CIImage *colorImage = [CIImage imageWithColor:whiteColor];
colorImage = [colorImage imageByCroppingToRect:ciImage.extent];
[filter setValue:ciImage forKey:kCIInputImageKey];
[filter setValue:colorImage forKey:kCIInputBackgroundImageKey];
CIImage *newImage = [filter valueForKey:kCIOutputImageKey];
[self scanImage:ciImage];
return YES;
}
[self scanImage:ciImage];
на[self scanImage:newImage];
, я получаю 1 найденную функцию с.messageString
изhttp://en.m.wikipedia.org
- person DonMag   schedule 25.01.2019CIDetector
обрабатывает альфа-канал какblack
... если я отредактирую ваше изображение QRCode и изменю его на что-нибудь, кроме черного (оставив прозрачные области как есть), я получу успешные результаты. - person DonMag   schedule 25.01.2019