当前位置: 首页 > news >正文

Quartz2D 给图片打水印

1. 水印:在图片上加的防止他人盗图的半透明logo、文字、图标

  水印作用:告诉你这个图片从哪来的

2. 实现方式:利用Quartz2D,将水印(文字、LOGO)画到图片的右下角

    将代码封装成UIImage的分类方法,便于使用

 1 + (instancetype)waterImageWithBg:(NSString *)bg logo:(NSString *)logo {
 2     UIImage *oldImage = [UIImage imageNamed:bg];
 3     // 1.创建一个基于位图(bitmap)的上下文(开启一个基于位图的上下文)
 4     // size:新图片的尺寸
 5     // opaque:YES:不透明,NO:透明
 6     // 这行代码过后,相当于创建一张新的bitmap,也就是新的UIImage对象
 7     UIGraphicsBeginImageContextWithOptions(oldImage.size, NO, 0.0);
 8     // 2.画背景
 9     [oldImage drawInRect:CGRectMake(0, 0, oldImage.size.width, oldImage.size.height)];
10     // 3.画水印
11     UIImage *image = [UIImage imageNamed:logo];
12 
13     CGFloat scale = 0.5; // 按比例缩小图片
14     CGFloat logoW = image.size.width * scale;
15     CGFloat logoH = image.size.height * scale;
16     CGFloat logoX = oldImage.size.width - logoW;
17     CGFloat logoY = oldImage.size.height - logoH;
18     [image drawInRect:CGRectMake(logoX, logoY, logoW, logoH)];
19     // 4.从上下文中获取制作完毕的UIImage对象
20     UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
21 
22     // 5.结束上下文
23     UIGraphicsEndImageContext();
24     return newImage;
25 }

打水印实质上是合成图片,把雪花❄️印在图片上,效果图如下:

4. 将生成的新图片写到沙盒中

    // 6.将image对象压缩成png格式的二进制数据
    NSData *data = UIImagePNGRepresentation(image);
    // 7.获得沙盒路径,写入文件
    NSString *documentPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"lufei.png"];
    [data writeToFile:documentPath atomically:YES];

 

转载于:https://www.cnblogs.com/caofutao/p/4824639.html

相关文章:

  • 【转】FAE及其发展前景
  • SQL自动调优
  • design pattern scard
  • 第 十 二 天 : shell 入 门 和 简 单 的 命 令
  • vim 程序编辑器
  • 普通用户启动apache服务
  • 【转】浮点数与十六进制如何转换?
  • 串口硬流控原理验证RTS与CTS
  • 1、计科研究生的学习之路
  • mysql支持emoji表情存取的解决方案
  • Android编译错误, Ignoring InnerClasses attribute for an anonymous inner class
  • Android中的资源与国际化!
  • frame与bounds
  • wpa_supplicant 和 802.11g WPA 认证的配置
  • 礼物
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • AngularJS指令开发(1)——参数详解
  • CentOS7 安装JDK
  • const let
  • JavaScript对象详解
  • Java基本数据类型之Number
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • Vue.js源码(2):初探List Rendering
  • vue脚手架vue-cli
  • Yeoman_Bower_Grunt
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 简单实现一个textarea自适应高度
  • 面试总结JavaScript篇
  • 排序算法学习笔记
  • 巧用 TypeScript (一)
  • 如何用vue打造一个移动端音乐播放器
  • 设计模式(12)迭代器模式(讲解+应用)
  • 阿里云API、SDK和CLI应用实践方案
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • (1)虚拟机的安装与使用,linux系统安装
  • (70min)字节暑假实习二面(已挂)
  • (八)Flask之app.route装饰器函数的参数
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (一一四)第九章编程练习
  • (译)2019年前端性能优化清单 — 下篇
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • [2018-01-08] Python强化周的第一天
  • [ARC066F]Contest with Drinks Hard
  • [BZOJ3211]:花神游历各国(小清新线段树)
  • [C#]winform制作圆形进度条好用的圆环圆形进度条控件和使用方法