原文链接:http://www.jianshu.com/p/36e9f012ef39
生成带 logo 的二维码 区域截屏相关 —— 由3033分享

开篇

最近项目需要搞了几个相对独立的小功能,今天有空总结一下他们的实现思路和方法,并总结一点项目中帮同事解决的问题,在此立个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 heightint 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 CGBitmapContextCreateCGContextRef 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二维码的生成,以及保存到本地相册,当然也可以把截屏的图片通过分享的方式分享给自己的好友,这里只是其中的一个使用方法。

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

  1. PHP 生成带logo二维码并修改背景颜色,利用画布布局二维样式

    二维码 先上图 <?phpinclude 'lib/phpqrcode.php'; require_once 'lib/image.php'; $value = "localhost/ ...

  2. 微信官方提供的生成二维码接口得到的是当前公众号的二维码

    转自:http://blog.csdn.net/phil_jing/article/details/53910083 微信官方提供的生成二维码接口得到的是当前公众号的二维码,官方文档 目前有2种类型的 ...

  3. 微信官方提供的生成二维码接口得到的是当前公众号的二维码。

    一定说明,这种方法我还没有测试,如果有疑问欢迎在评论区域讨论. .................... ................... 谢谢. 微信官方提供的生成二维码接口得到的是当前公众号 ...

  4. 生成带参数的2维码(微信2次开发)

    获取带参数的二维码的过程包括两步,首先创建二维码ticket,然后凭借ticket到指定URL换取二维码.(每次创建二维码ticket需要提供一个开发者自行设定的参数(scene_id)) 目前有2种 ...

  5. 二维码相关---java生成二维码名片,并且自动保存到手机通讯录中...

    二维码相关---java生成二维码名片,并且自动保存到手机通讯录中... 技术qq交流群:JavaDream:251572072 1.首先介绍一个api.   Zxing是Google提供的关于条码 ...

  6. 怎么让微信的扫一扫扫描二维码后安装apk 苹果手机下载APP怎样扫描二维码实现下载功能

    二维码深入人心,很多App都在官网挂出了可以扫描下载apk的二维码,笔者所在公司的产品也不例外.一般二维码编码的URL不会直接放apk而是放中间地址,通过这个中间地址再跳转到apk所在URL,原因大概 ...

  7. 数据转换成二维码并导出进Excel中和导入时解码二维码反转成数据

    数据转换成二维码并导出进Excel中和导入时解码二维码反转成数据 第一步在maven中配置需要的二维码jar包 1.1 谷歌提供的帮助类 1.2 关于二维码的工具类 1.3 测试类 第二步 在Exce ...

  8. 初识二维码 第二十讲 二维码解码程序的组件之一 摄像头拍照功能

    初识二维码 第二十讲    二维码解码程序的组件之一 摄像头拍照功能 解码程序的第一个环节是通过摄像头这个硬件,得到二维码的图片. 对摄像头的工作原理来说,简单的描述如下:1是从摄像头得到模拟信号, ...

  9. 如何做二维码?教你一招轻松制作个性二维码

    怎么制作二维码呢?在平常会接触很多的二维码,可能是跳转到商品购买链接,也可能是展示图片,文字,视频等等内容,那么这些二维码制作的方法是什么呢?其实想要制作这些类型的二维码的,方法都是一样的,通过二维码 ...

最新文章

  1. Android控件之ConstraintLayout详解
  2. 关于Kingfisher--备用
  3. 学习手记(2018.9.15~2018.11.10)——备战NOIP2018
  4. mingw + msys 上编译 ffmpeg
  5. Android 启动过程简析(一)之 init 进程
  6. MySql中执行 GROUP BY 分组 遇到 1055错误
  7. 虚拟机CentOS系统没有UNIX2dos或dos2UNIX命令的解决方案(参考各路大佬后的总结)
  8. python小区管理系统设计_小区物业管理系统设计与实现 毕业设计
  9. libcrypto yum 安装_CentOS升级OpenSSL至OpenSSL 1.1.0f版本其中有遇到libcrypto.so的问题...
  10. 全国大学生“高教杯“成图大赛:关于蜗轮蜗杆快速建模研究(一)
  11. 水彩画笔效果PS笔刷
  12. CRM客户关系管理系统源码
  13. 看这篇就够了!能源企业数字化升级,推动绿色低碳发展
  14. mmap()、munmap()的用法、例子
  15. 水利水电课程指导之建筑制图基础_第三章
  16. JavaScript之参数传递
  17. 《平凡的世界》/《白鹿原》电视剧 观后感
  18. IE7提示“出现运行时间错误,是否要进行调试?”的解决办法
  19. 海康威视摄像机SDK二次开发--初始化windows-sdk-java环境
  20. canon ip 1180 喷墨打印机 mac 驱动

热门文章

  1. .NET调用JAVA的WebService方法
  2. TextView-- 测量文字宽度
  3. Android环境结构--安装Eclipse错
  4. android笔记1——开发环境的搭建
  5. 设计模式:备忘录模式??
  6. 同花顺的数据格式总览(转帖)
  7. linux中的apachectl是什么命令
  8. PyTorch中nn.Module类简介
  9. 提高C++性能的编程技术笔记:总结
  10. C++/C++11中用于定义类型别名的两种方法:typedef和using