iOS生成带logo的二维码,区域截屏保存至相册(小功能二连发(一))

开篇

最近项目需要搞了几个相对独立的小功能,今天有空总结一下他们的实现思路和方法,并总结一点项目中帮同事解决的问题,在此立个flag,今天晚上分两篇写一下其中的主要内容,写不完不睡觉了,哈哈。

01.jpg

主要内容

  • 生成带logo的二维码
  • 截屏保存至相册(区域截屏或当前屏幕截屏)

ZXingObjC生成带logo二维码

利用ZXingObjC生成二维码在之前的文章中我们做过详细的介绍,可以参考之前的一篇文章:二维码的生成和使用
文章中介绍了二维码的生成和扫描,这里我们在介绍一下带logo二维码的生成,同时设置容错率和去除二维码生成时白色边框的问题。

  • 根据后台返回的地址信息生成二维码图片
    主要生成的代码如下:
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{       
        dispatch_async(dispatch_get_main_queue(), ^{
            
            if ([_userDic objectForKey:@"url"] != nil) {
                successShareView = [[SinginShareView alloc]initWithFrame:self.view.bounds];
                [successShareView.iconImageView sd_setImageWithURL:[NSURL URLWithString:[_userDic objectForKey:@"headimg"]] placeholderImage:[UIImage imageNamed:@"placeholderImage_square"]];
                successShareView.namedLb.text = [_userDic objectForKey:@"name"];
                
                ZXMultiFormatWriter *writer = [[ZXMultiFormatWriter alloc] init];
                ZXEncodeHints *hints = [ZXEncodeHints hints];
                hints.encoding = NSUTF8StringEncoding;
                hints.dataMatrixShape =ZXDataMatrixSymbolShapeHintForceSquare;
                hints.margin = [NSNumber numberWithInt:0.];
                
                hints.errorCorrectionLevel = [ZXQRCodeErrorCorrectionLevel errorCorrectionLevelH];
                NSString *qrString = [_userDic objectForKey:@"url"];
                ZXBitMatrix *result = [writer encode:qrString format:kBarcodeFormatQRCode width:500 height:500 hints:hints error:nil];
                
                if (result) {
                    
                    CGImageRef image = [[ZXImage imageWithMatrix:result] cgimage];
                    UIImage *image1 =   [UIImage imageWithCGImage:image];//二维码原图
                    UIImage *subIamge = [UIImage imageNamed:@"新签到切图logo@2x-X"];
                    
                    __weak typeof(self) weakSelf = self;
                    successShareView.erweimaImageView.image =[weakSelf addSubImage:image1 sub:subIamge];//二维码里加图标,生成带logo的方法
                //                    successShareView.erweimaImageView.image =image1;//生成不带logo的二维码的方法          
                    
                } else {
                    successShareView.erweimaImageView.image = nil;
                }
            }
            successShareView.delegate =self;
            [self.view addSubview:successShareView];
            
        });
    });
  • 二维码图片与logo图片合并的方法
-(UIImage *)addSubImage:(UIImage *)img sub:(UIImage *) subImage
{
    //get image width and height
    int w = img.size.width;
    int h = img.size.height;
    int subWidth = 100*ratio_width;
    int subHeight =100*ratio_width;
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    //create a graphic context with CGBitmapContextCreate
    CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst);
    CGContextDrawImage(context, CGRectMake(0, 0, w, h), img.CGImage);
    CGContextDrawImage(context, CGRectMake( (w-subWidth)/2, (h - subHeight)/2, subWidth, subHeight), [subImage CGImage]);
    CGImageRef imageMasked = CGBitmapContextCreateImage(context);
    CGContextRelease(context);
    CGColorSpaceRelease(colorSpace);
    return [UIImage imageWithCGImage:imageMasked];
}

生成的带logo的二维码如下:
生成的二维码.png

注意点:这里因为要设置logo的关系,可能会存在二维码信息被遮挡导致有个别信息不能被识别的情况发生,要注意以下两点:

    1. 设置生成二维码的容错率
 hints.errorCorrectionLevel = [ZXQRCodeErrorCorrectionLevel errorCorrectionLevelH];

  • 2.注意设置logo的大小 ,这里的logo大小要根据自己的二维码大小去设置。
  int subWidth = 100*ratio_width;
  int subHeight =100*ratio_width;

区域截屏并保存至相册

我们需要截屏的原来界面如下:

原图.png
可以看到我们生成的要待保存的图片,包含灰色背景,和右上角的叉号,我们要保存的最终效果如下:

截取区域保存成全屏.png

截取红色框内部分.png
可以看到我们只保存了我们想要的部分控件到我们的相册。
实现的代码如下:

//截屏分享  传入想截屏的view(也可以是controller  webview只能截当前屏幕-_-`,用其他的方法)
-(void)saveImageView
{
    UIGraphicsBeginImageContextWithOptions(successShareView.SinginShareView.bounds.size, NO, 0);
    CGContextRef ctx =  UIGraphicsGetCurrentContext();
    [successShareView.SinginShareView.layer renderInContext:ctx];
    // 这个是要分享图片的样式(自定义的)
    UIImage * newImage = UIGraphicsGetImageFromCurrentImageContext();
    //保存到本地相机
    UIImageWriteToSavedPhotosAlbum(newImage,self,@selector(image:didFinishSavingWithError:contextInfo:),nil);
    
}

保存图片至相册的回调方法

//保存相片的回调方法
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
    if (error) {
        [SVProgressHUD showErrorWithStatus:@"保存失败"];
    } else {
        [SVProgressHUD showSuccessWithStatus:@"成功保存到相册"];
    }
}

通过以上方式,我们可以保存我们自己想保存的控件和内容,但是在webview的时候只能保存当前页,如果想截屏整个webview的话需要增加代码,这里暂时就不放了。

后记

通过以上方法我们就实现了带logo二维码的生成,以及保存到本地相册,当然也可以把截屏的图片通过分享的方式分享给自己的好友,这里只是其中的一个使用方法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容