二维码 生成、读取, 以及调整图片大小,截屏

本文介绍了如何在iOS中生成二维码,调整图片大小,添加logo以及读取二维码信息。通过使用Core Image和CIDetector进行二维码处理,同时提供了截屏和图像尺寸调整的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//1.生成二维码

+ (CIImage *)createQRCodeFromString:(NSString *)str{

    // 创建二维码

    CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];//CICode128BarcodeGenerator

    // 2. 恢复滤镜的默认属性

    [filter setDefaults];

    // 3. 将字符串转换成NSData

    NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];

    // 4. 通过KVO设置滤镜inputMessage数据

    [filter setValue:data forKey:@"inputMessage"];

    // 5. 获得滤镜输出的图像

    CIImage *outputImage = [filter outputImage];

    // 6. CIImage转换成UIImage,并放大显示,这种方式的图片可能比较模糊,见下面的处理步骤2

    //    UIImage* image =  [UIImage imageWithCIImage:outputImage scale:0 orientation:UIImageOrientationUp];

    return outputImage;

}


//2.调整图片到指定大小

+ (UIImage *)changeImageSizeWithCIImage:(CIImage *)ciImage andSize:(CGFloat)size{

    CGRect extent = CGRectIntegral(ciImage.extent);

    CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));

    

    // 创建bitmap;

    size_t width = CGRectGetWidth(extent) * scale;

    size_t height = CGRectGetHeight(extent) * scale;

    CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();

    CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 80, cs, (CGBitmapInfo)kCGImageAlphaNone);

    CIContext *context = [CIContext contextWithOptions:nil];

    CGImageRef bitmapImage = [context createCGImage:ciImage fromRect:extent];

    CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);

    CGContextScaleCTM(bitmapRef, scale, scale);

    CGContextDrawImage(bitmapRef, extent, bitmapImage);

    // 保存bitmap到图片

    CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);

    CGContextRelease(bitmapRef);

    CGImageRelease(bitmapImage);

    return [UIImage imageWithCGImage:scaledImage];

}


//3.中间添加logo

- (UIImage *)addImageToSuperImage:(UIImage *)superImage withSubImage:(UIImage *)subImage andSubImagePosition:(CGRect)posRect{

    UIGraphicsBeginImageContext(superImage.size);

    [superImage drawInRect:CGRectMake(00, superImage.size.width, superImage.size.height)];

    //四个参数为水印图片的位置

    [subImage drawInRect:posRect];

    UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return resultingImage;

}



#4. 读取图片中的二维码

/**

 *  读取图片中的二维码

 *

 *  @param image 图片

 *

 *  @return 图片中的二维码数据集合 CIQRCodeFeature对象

 */

+ (NSArray *)readQRCodeFromImage:(UIImage *)image{

    // 创建一个CIImage对象

    CIImage *ciImage = [[CIImage allocinitWithCGImage:image.CGImage options:nil];

    CIContext *context = [CIContext contextWithOptions:@{kCIContextUseSoftwareRenderer : @(YES)}]; // 软件渲染

    CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:context options:@{CIDetectorAccuracy : CIDetectorAccuracyHigh}];// 二维码识别

    // 注意这里的CIDetectorTypeQRCode

    NSArray *features = [detector featuresInImage:ciImage];

//    NSLog(@"features = %@",features); // 识别后的结果集

    for (CIQRCodeFeature *feature in features) {

        NSLog(@"msg = %@",feature.messageString); // 打印二维码中的信息

    }

    return features;

}


//5.截屏

/**

 *  截图

 *

 *  @param view 需要截取的视图

 *

 *  @return 截图 图片

 */

+ (UIImage *)screenShotFormView:(UIView *)view

{

    UIGraphicsBeginImageContextWithOptions(view.bounds.sizeYES, [UIScreen mainScreen].scale);

    [view.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return img;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值