当前位置: 首页 > 编程日记 > 正文

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

原文链接: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二维码的生成,以及保存到本地相册,当然也可以把截屏的图片通过分享的方式分享给自己的好友,这里只是其中的一个使用方法。

相关文章:

JavaScript-学习一全局变量

因为局部变量只作用于函数内,所以不同的函数可以使用相同名称的变量。 局部变量在函数开始执行时创建,函数执行完后局部变量会自动销 不限制位置的 JavaScript 变量生命周期在它声明时初始化。 局部变量在函数执行完毕后销毁。 全局变量在页面关闭后销毁…

Android 4.2真坑爹

艹~~~,Android4.2真坑爹,4.1以前的方法都不能使用了。 操蛋呢。。。转载于:https://www.cnblogs.com/liushuibufu/p/3253611.html

ESXi6.5环境搭建(五:常见问题及解决方案实验总结)

实验目的及要求 完成VMware workstations安装,会应用相关操作;完成虚拟机中ESXI6.5平台的安装及网络环境配置;完成VMware vSphere Client 6.0软件在PC端的安装及配置;完成使用浏览器或者VMware vSphere Client 6.0中对ESXI6.5的操…

《Linux4.0设备驱动开发详解》笔记--第十二章:Linux设备驱动的软件架构思想

待补充转载于:https://www.cnblogs.com/zcjboke/p/5513130.html

iOS_Development~ 添加 / 隐藏 UITabBar 右上角的小红点

原文链接:http://www.jianshu.com/p/de72118a49ad添加 / 隐藏 UITabBar 右上角的小红点 —— 由anticipate_91分享添加/隐藏UITabBar右上角的小红点 话不多说,直接上代码吧! 1.添加tabBar的小红点 /** 添加tabBar的小红点* index&#xff1…

解决ubuntu上opengl的问题

装完ubuntu之后,对于opengl的程序总是出现问题,先将解决方案列出如下: http://www.linuxforums.org/forum/ubuntu-linux/175490-graphics-driver-problem.html http://superuser.com/questions/484991/nvidia-graphics-driver-in-ubuntu-12-0…

OpenStack环境搭建(一:Virtual Box 5.1 环境的安装及配置)

实验要求: 完成Virtual box平台安装,会应用相关操作;在virtual box虚拟平台上部署Fuel Master节点;在virtual box虚拟平台上部署计算节点Computer;在virtual box虚拟平台上部署控制节点Controller;在web控…

[转载]SSH框架搭建详细图文教程

什么是SSH? SSH对应 struts spring hibernatestruts 采用MVC模式,主要是作用于用户交互spring 采用IOC和AOP~作用比较抽象,是用于项目的松耦合hibernate 是对象持久化框架,其实就是实体类和数据库表建立关系,操作类就会触发相应的…

iOS 开发之 pdf 文档的加载与浏览的 4 种方式

原文链接:http://www.jianshu.com/p/1d4305a02ea5在我们的开发中,有些像电子书类型的 app 的开发会涉及到 pdf 文档的加载与展示。由于笔者项目中正好涉及到这块,于是将 pdf 常用的几种加载方式做个总结。以供后面可能用到的同学做个参考。 —…

利用三个点(trsf)来实现各种规则图形的实现

在Val3,是使用trsf(x,y,z,rx,ry,rz)来实现三维空间点的位置与方向。其中第一点和第二点位置很重要,第三点是用来确定方向。根据这三个点先确定一个用户坐标系。在这个坐标系中,实现圆,三角形,矩形,腰圆,正五…

OpenStack环境搭建(二:Fuel Master的安装及配置)

实验要求: 完成Virtual box平台安装,会应用相关操作;在virtual box虚拟平台上部署Fuel Master节点;在virtual box虚拟平台上部署计算节点Computer;在virtual box虚拟平台上部署控制节点Controller;在web控…

ScratchCardView:刮刮卡视图组件

原文链接:https://github.com/pgorzelany/ScratchCardViewScratchCardView:刮刮卡视图组件。# 为开源点赞# —— 由SwiftLanguage分享Example To run the example project, clone the repo, and run pod install from the Example directory first. Inst…

getaddrinfo()函数详解

1. 概述IPv4中使用gethostbyname()函数完成主机名到地址解析,这个函数仅仅支持IPv4,且不允许调用者指定所需地址类型的任何信息,返回的结构只包含了用于存储IPv4地址的空间。IPv6中引入了getaddrinfo()的新API,它是协议无关的&…

OpenStack环境搭建(三:Computer与Controller节点的安装及配置)

实验要求: 完成Virtual box平台安装,会应用相关操作;在virtual box虚拟平台上部署Fuel Master节点;在virtual box虚拟平台上部署计算节点Computer;在virtual box虚拟平台上部署控制节点Controller;在web控…

iOS - 支持水平 / 垂直显示自动滚动的跑马灯控件 --- SKAutoScrollLabel 的使用和实现

原文链接:http://www.jianshu.com/p/7221bc08f26aSKAutoScrollLabel 是一个同时支持水平 / 垂直两种类型的 “跑马灯” 效果的自动滚动 UILabel。在滚动的边缘使用了梯度褪色来解决滚动边缘生硬的效果问题,总体效果呈现出混然天成的感觉,并且…

Git简明手册

文/AbnerKang(简书作者)原 文链接:http://www.jianshu.com/p/d7a7ba4f2341?utm_campaignmaleskine& utm_contentnote&utm_mediumreader_share&utm_sourceweixin&fromtimeline&isappinstalled0著作权归作者所…

今天是2013年06月21日,博客之路开始了!

RT,从今天开始,准备养成写博客的习惯。 一是对学习的成果进行总结  二是检验自己是否真的弄懂某一个问题  三是分享出来与大家共勉。从此开启我的程序人生之路吧!转载于:https://www.cnblogs.com/penghongwei/p/3147999.html

OpenStack环境搭建(四:web控制端各节点的部署及配置)

实验要求: 完成Virtual box平台安装,会应用相关操作;在virtual box虚拟平台上部署Fuel Master节点;在virtual box虚拟平台上部署计算节点Computer;在virtual box虚拟平台上部署控制节点Controller;在web控…

Spring+SpringMVC+shiro+mysql(一)

SpringSpringMVCshiromysql(一) 最近要做个后台管理系统,就会设计到权限的管理控制,于是就想到 shiro ,下面是自己对Springshiro的一点点理解,记录下来,一起多探讨: 项目结构 1. pom…

【iOS】Socket/TCP 通信 发送 NSString 字符串格式数据

Socket/TCP 原理这里就不阐述了,网上一搜一大堆,直接上关键代码。 【注】iOS 目前有非常著名的第三方库 CocoaAsyncSocket 可以使用,但是我们项目当时做大数据上报要求直接发送 NSString 格式数据,所以自己写了一个简易版 TCP 连接…

[Win]进程间通信——邮槽Mailslot

进程间通信 进程的地址空间是私有的。出于安全性的目的,如果一个进程不具有特殊的权限,是无法访问另外一个进程的内存空间的,也无法知道内存中保存的数据的意义。但是在一些具体的应用情况下需要多个进行相互配合,有时计算机用户也…

OpenStack环境搭建(五:附加项虚拟机文件备份使用)

实验要求: 完成Virtual box平台安装,会应用相关操作;在virtual box虚拟平台上部署Fuel Master节点;在virtual box虚拟平台上部署计算节点Computer;在virtual box虚拟平台上部署控制节点Controller;在web控…

IOS入门-TargetAction

创建一个UIButton 并用Target - Action来监听它的点击事件 Target -- self控制器 Action -- 具体动作,self控制器中的某个方法 forControlEvents:UIControlEventTouchUpInside -- 表示监听的事件 1 - (void)btnclick:(id)sender2 {3 NSLog("点击%" ,…

【iOS_Development】文件操作

原文链接:http://www.jianshu.com/p/c5820ab6836biOS 文件操作 —— 由anticipate_91分享NSFileManager:是用来管理文件系统的,它可以用来进行常见的文件\文件夹操作获取NSFileManager示例[NSFileManager defaultManager] 增删改查 1. 创建文…

仿人智能控制器的参数简化(已发表于《计算机测量与控制》2013年第4期)

转载于:https://www.cnblogs.com/snake-hand/p/3153313.html

OpenStack环境搭建(六:常见问题及解决方案总结)

实验要求: 完成Virtual box平台安装,会应用相关操作;在virtual box虚拟平台上部署Fuel Master节点;在virtual box虚拟平台上部署计算节点Computer;在virtual box虚拟平台上部署控制节点Controller;在web控…

工作区和暂存区

Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。 先来看名词解释。 工作区(Working Directory) 就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区: 版本库(Repository) 工…

Lucene类介绍

IndexWriter:lucene中最重要的的类之一,它主要是用来将文档加入索引,同时控制索引过程中的一些参数使用。 Analyzer luceneAnalyzer new StandardAnalyzer(); IndexWriter indexWriter new IndexWriter(indexDir, luceneAnalyzer, true );…

iOS 开发之沙盒机制 文件操作 (NSFielManager)

原文链接:http://www.jianshu.com/p/349855b5a8aeiOS APP 可以在自己的沙盒里读写文件,但是,不可以访问其他 APP 的沙盒。每一个 APP 都是一个信息孤岛,相互是不可以进行通信的,唯独可以通过 URL Scheme。沙盒里面的文…

手动部署OpenStack环境(一:Virtual Box 5.1 环境的安装及配置)

任务一、Virtual Box 5.1 环境的安装及配置 1.1、安装环境检查 1.2、创建安装目录 1.3、安装及配置 实验目的及要求 完成Virtual box平台安装,会应用相关操作;在virtual box虚拟平台上部署网络节点Network;在virtual box虚拟平台上部署计算…