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

问题描述 投票:-2回答:1

我为快速的语言找到了太多答案,但没有找到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;
    }

我迅速找到了一些与实现有关的代码。如果有人可以帮助我将下面的代码转换为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吗?

提前感谢。

ios objective-c swift qr-code
1个回答
0
投票

我的问题的客观-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);
}
© www.soinside.com 2019 - 2024. All rights reserved.