如何在 Objective-C 中更改二维码的颜色?



我为快速语言找到了太多答案,但对Objective-C却没有。而且我在将 swift 转换为 Objective-C 方面很差 以下是我用于生成QR码的代码:

CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
CIFilter *colorFilter = [CIFilter filterWithName:@"CIFalseColor"];
[filter setDefaults];
NSData *data = [[VizsafeCommonUtil trimWhiteSpaceAndNewLine:Globals.instance.uuid] dataUsingEncoding:NSUTF8StringEncoding];
[filter setValue:data forKey:@"inputMessage"];
CIImage *outputImage = [filter outputImage];
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef cgImage = [context createCGImage:outputImage fromRect:[outputImage extent]];
UIImage *image = [UIImage imageWithCGImage:cgImage scale:1. orientation:UIImageOrientationUp];
// Resize without interpolating
UIImage *resized = [self resizeImage:image withQuality:kCGInterpolationNone rate:5.0];
self.imageView.image = resized;
CGImageRelease(cgImage);  
- (UIImage *)resizeImage:(UIImage *)image withQuality:(CGInterpolationQuality)quality rate:(CGFloat)rate {
UIImage *resized = nil;
CGFloat width = image.size.width * rate;
CGFloat height = image.size.height * rate;
UIGraphicsBeginImageContext(CGSizeMake(width, height));
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetInterpolationQuality(context, quality);
[image drawInRect:CGRectMake(0, 0, width, height)];
resized = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return resized;
}

我在 swift 中找到了一些与我的实现相关的代码,如果有人可以帮助我将以下代码转换为 Objective-C,那将非常有帮助。

func generateQRCode(from string: String) -> UIImage? {
let data = string.data(using: String.Encoding.utf8)
if let filter = CIFilter(name: "CIQRCodeGenerator") {
guard let colorFilter = CIFilter(name: "CIFalseColor") else { return nil }
filter.setValue(data, forKey: "inputMessage")
filter.setValue("H", forKey: "inputCorrectionLevel")
colorFilter.setValue(filter.outputImage, forKey: "inputImage")
colorFilter.setValue(CIColor(red: 1, green: 1, blue: 1), forKey: "inputColor1") // Background white
colorFilter.setValue(CIColor(red: 1, green: 0, blue: 0), forKey: "inputColor0") // Foreground or the barcode RED
guard let qrCodeImage = colorFilter.outputImage
else {
return nil
}
let scaleX = imgQRCode.frame.size.width / qrCodeImage.extent.size.width
let scaleY = imgQRCode.frame.size.height / qrCodeImage.extent.size.height
let transform = CGAffineTransform(scaleX: scaleX, y: scaleY)

if let output = colorFilter.outputImage?.applying(transform) {
return UIImage(ciImage: output)
}
}
return nil
}  

那么谁能帮我把上面的代码转换成Objective-C呢?

提前谢谢。

我的问题的目标 -C 版本:

- (void)generateQRCode:(NSString *)userStatus {
NSData *data = [[VizsafeCommonUtil trimWhiteSpaceAndNewLine:Globals.instance.uuid] dataUsingEncoding:NSUTF8StringEncoding];
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
CIFilter *colorFilter = [CIFilter filterWithName:@"CIFalseColor"];
[filter setDefaults];
[filter setValue:data forKey:@"inputMessage"];
[filter setValue:@"H" forKey:@"inputCorrectionLevel"];
[colorFilter setValue:filter.outputImage forKey:@"inputImage"];
if ([userStatus isEqualToString:@"pass"]) {
[colorFilter setValue:[CIColor colorWithRed:1 green:1 blue:1] forKey:@"inputColor1"];
[colorFilter setValue:[CIColor colorWithRed:0 green:1 blue:0] forKey:@"inputColor0"];
[self.btnMyHealthPass setTitleColor:[UIColor greenColor] forState:UIControlStateNormal];
} else if ([userStatus isEqualToString:@"fail"]) {
[colorFilter setValue:[CIColor colorWithRed:1 green:1 blue:1] forKey:@"inputColor1"];
[colorFilter setValue:[CIColor colorWithRed:1 green:0 blue:0] forKey:@"inputColor0"];
[self.btnMyHealthPass setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
} else {
[colorFilter setValue:[CIColor colorWithRed:1 green:1 blue:1] forKey:@"inputColor1"];
[colorFilter setValue:[CIColor colorWithRed:0 green:0 blue:0] forKey:@"inputColor0"];
[self.btnMyHealthPass setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
}
//CIImage *outputImage = [filter outputImage];
CIImage *outputImage = [colorFilter outputImage];
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef cgImage = [context createCGImage:outputImage fromRect:[outputImage extent]];
UIImage *image = [UIImage imageWithCGImage:cgImage scale:1. orientation:UIImageOrientationUp];
// Resize without interpolating
UIImage *resized = [self resizeImage:image withQuality:kCGInterpolationNone rate:5.0];
self.imageView.image = resized;
CGImageRelease(cgImage);
}

最新更新