Swift页面添加水印

本文主要讨论的是给图片或者视图添加全屏水印。比较常见的是添加单个水印,这个比较好处理,网络上也有很多参考的方法。本文实现的是铺满的全屏水印,具体参考效果如下:

实现思路:

1、根据水印文本以及相应样式生成水印图片,水印图大小根据文本计算而来

2、生成需要铺满水印图片或视图 的空白底图

3、采用贴地砖的方式将水印图从左至右,从上至下贴在底图上

具体实现参考代码如下:

/// 创建全铺图片水印
    /// - Parameters:
    ///   - strTxt: 水印文本
    ///   - fsize: 全铺的尺寸
    ///   - corners: 圆角信息(可选)
    ///   - r: 圆角值(可选)
    /// - Returns: UIImage
    func createWatermarkFor(Text strTxt:String,
                            andFullSize fsize:CGSize,
                            andCorners corners:UIRectCorner? = nil,
                            withRadius r:CGFloat? = nil) -> UIImage {
        
        //[S] 1、设置水印样式
        let paragraphStyle:NSMutableParagraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineBreakMode = .byWordWrapping
        paragraphStyle.lineSpacing = 6.0 * Setting.shareInstance.K_APP_PROPORTION
        paragraphStyle.alignment = .center
        
        var _attr:[NSAttributedString.Key:Any] = [
            .font : UIFont.systemFont(ofSize: 15, weight: .semibold),
            .foregroundColor:UIColor.init().colorFromHexInt(hex: 0xE8E8E8, alpha: 0.5),
            .paragraphStyle: paragraphStyle,
            .kern:1.0,
        ]
        
        if #available(iOS 14.0, *) {
            _attr[.tracking] = 1.0
        }
        
        let attributedString:NSMutableAttributedString = NSMutableAttributedString.init(string: strTxt)
        let stringRange = NSMakeRange(0, attributedString.string.utf16.count)
        attributedString.addAttributes(_attr,range: stringRange)
        //[E]
        
        //[S] 2、建立水印图
        let _max_value = attributedString.size().width > attributedString.size().height ? attributedString.size().width : attributedString.size().height
        let _size = CGSize.init(width: _max_value + 10, height: _max_value + 10)
        
        //2.1、设置上下文
        if UIScreen.main.scale > 1.5 {
            UIGraphicsBeginImageContextWithOptions(_size,false,0)
        }
        else{
            UIGraphicsBeginImageContext(_size)
        }
        var context = UIGraphicsGetCurrentContext()
        
        //2.2、根据中心开启旋转上下文矩阵
        //将绘制原点(0,0)调整到源image的中心
        context?.concatenate(.init(translationX: _size.width * 0.8, y: _size.height * 0.4))
        
        //以绘制原点为中心旋转45°
        context?.concatenate(.init(rotationAngle: -0.25 * .pi))
        
        //将绘制原点恢复初始值,保证context中心点和image中心点处在一个点(当前context已经发生旋转,绘制出的任何layer都是倾斜的)
        context?.concatenate(.init(translationX: -_size.width * 0.8, y: -_size.height * 0.4))
        
        //2.3、添加水印文本
        attributedString.draw(in: .init(origin: .zero, size: _size))
        
        //2.4、从上下文中获取水印图
        let _waterImg = UIGraphicsGetImageFromCurrentImageContext() ?? UIImage.init()
        //[E]
        
        //[S] 3、重设上下文,建立底图
        if UIScreen.main.scale > 1.5 {
            UIGraphicsBeginImageContextWithOptions(fsize,false,0)
        }
        else{
            UIGraphicsBeginImageContext(fsize)
        }
        context = UIGraphicsGetCurrentContext()
        
        //3.1圆角底图(可选)
        if corners != nil && r != nil && r?.isNaN == false && r?.isFinite != false {
            let rect:CGRect = .init(origin: .zero, size: fsize)
            let bezierPath:UIBezierPath = UIBezierPath.init(roundedRect: rect,
                                                            byRoundingCorners: corners!,
                                                            cornerRadii: CGSize(width: r!, height: r!))
            
            context?.addPath(bezierPath.cgPath)
        }
        
        //3.2 将水印图贴上去
        var _tempC = fsize.width / _waterImg.size.width
        var _maxColumn:Int = _tempC.isNaN || !_tempC.isFinite ? 1 : Int(_tempC)
        if fsize.width.truncatingRemainder(dividingBy: _waterImg.size.width) != 0 {
            _maxColumn += 1
        }
        
        _tempC = fsize.height / _waterImg.size.height
        var _maxRows:Int = _tempC.isNaN || !_tempC.isFinite ? 1 : Int(_tempC)
        if fsize.height.truncatingRemainder(dividingBy: _waterImg.size.height) != 0 {
            _maxRows += 1
        }
        
        for r in 0..<_maxRows {
            for c in 0..<_maxColumn {
                let _rect:CGRect = .init(origin: .init(x: CGFloat(c) * _waterImg.size.width,
                                                       y: CGFloat(r) * _waterImg.size.height),
                                         size: _waterImg.size)
                _waterImg.draw(in: _rect)
            }
        }
        
        //裁剪、透明
        context?.clip()
        context?.setFillColor(UIColor.clear.cgColor)
        context?.fill(.init(origin: .zero, size: fsize))
        
        //3.3 输出最终图形
        let _canvasImg = UIGraphicsGetImageFromCurrentImageContext() ?? UIImage.init()
        //[E]
        
        //4、关闭图形上下文
        UIGraphicsEndImageContext()
        
        return _canvasImg

}


调用方法示例:

let _img = createWatermarkFor(Text:"      水印文本1\n 水印文本2\n水印文本3", andFullSize:_imgV.size)


思考:

1、水印图需要旋转可参考旋转方向示例图:

 由于旋转的是文本,水印图本身并未旋转,因此可能导致文本会超出水印图的区域而被裁剪,导致未显示全。

解决方案:

1、设置水印图的尺寸为水印文本计算而来的宽或高的最大值为其宽度和高度,这样确保旋转后内容不会超出水印(这只是针对水印文本居中对齐的情况)

2、假如水印文本要求左/右对齐,除了采用方案1,还需要在文本开头添加空白,让其避开可能被裁掉的区域(尤其是一个水印图中要设置多行文本的情况下)

老仙儿
关注 关注
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Swift 给图片添加水印
一步一迹的博客
07-26 2250
要给图片添加一个水印感性的想想其实就是在图片上面绘制文字,一般有如下几步:第一要获取到画布;第二要在画布中绘制文字;第三获取到新的图片。不啰嗦了看代码具体和注释 这里我是给UIImage这个类添加了一个拓展import Foundation import UIKit extension UIImage { func drawTextInImage()->UIImage { /
Swift 图片加水印
JLM
01-09 493
func getWaterMark(_ originalImage: UIImage?, title: String, andMark markFont: UIFont, andMark markColor: UIColor) -&gt; UIImage? { let HORIZONTAL_SPACE: CGFloat = 30 let VERTICAL_SPA...
Swift - 给图片添加图片水印
swift_vip的博客
06-21 668
使用样例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import UIKit   class ViewController: UIViewController {  
iOS 添加水印
哈皮吖的博客
08-30 1665
1 、创建view : LHWaterMarkView 具体实现 LHWaterMarkView.h 中 /** 设置水印 @param frame 水印大小 @param markText 水印显示的文字 */ - (instancetype)initWithFrame:(CGRect)frame WithText:(NSString *)markText; LHWaterMark...
swift-ZZImageAddWatermark图片添加文字水印图片水印自定义二维码生成水印
08-15
ZZImageAddWatermark 图片添加文字水印,图片水印,自定义二维码生成水印
Swift - 给图片添加文字水印(图片上写文字,并可设置位置和样式)
weixin_34161032的博客
09-28 266
想要给图片添加文字水印或者注释,我们需要实现在UIImage上写字的功能。 1,效果图如下: (在图片左上角和右下角都添加了文字。) 2,为方便使用,我们通过扩展UIImage类来实现添加水印功能 (文字大小,文字颜色,背景色,位置,边距都可以设置) 1 2 3 4 5 6 7 8 9 10 11 12 13 14...
iOS给图片添加水印 swift版本
Alamo Fire
05-09 1447
let image = UIImage(named: "2.jpg") let imageLogo = UIImage(named: "123.png") // 添加图片的水印 // 1 开启一个位图上下文 位图上下文跟view无关 // size 是画板的尺寸 UIGraphicsBeginImageContext((image?.size)!)// 2 给原始图片添加文字 image?.draw
swift, webview 注入js添加水印
flg1554112450的博客
07-28 613
注入位置可以在webViewDidFinishLoad 代理方法里添加,但当webview有图片,加载时间很长,水印添加会等待很久,所以 可以在webViewDidStartLoad 添加延时执行,注入js 水印,可以很快添加水印,无需等待页面全部加载完毕 [self performSelector:@selector(addWaterAction) withObject:self afterDelay:1]; func addWaterMarkView(){ ...
WaterMarkView:iOS全屏水印的实现
05-14
WaterMarkView iOS全屏水印的实现 使用方法: #import "CxfWaterMarkView.h" [self.view addSubview:[CxfWaterMarkView addWaterMarkView:@"全屏水印"]];...把创建的文字水印View添加到你指定的View上就可以。
swift语言IOS8开发战记19 UIImagePickerController
热门推荐
Cwift的专栏
01-18 1万+
我们接着上一话的内容来讲,首先在我们添加一个餐馆的页面中把点击的背景色取消掉使用的是以下语句: cell.selectionStyle = UITableViewCellSelectionStyle.None 除了none之外,还有许多颜色的选项,大家可以自己试试。然后我们需要点击小相机的图片能打开我们的相册让我们选择图片,我们在选择的代理方法中增加一个我们自己定义的方法,代码如下: fun
PDFTron。工具
02-25
这包括添加、删除、移动或替换页面内容,调整字体和颜色,以及编辑链接和注释。 3. **表单处理**:PDFTron支持交互式表单填写和提交,允许用户填写和保存数据,甚至可以将表单导出为XML。 4. **转换功能**:除了...
SwiftUI数据流之State&Binding
SOHU_TECH的博客
10-01 1372
本文字数:4569字预计阅读时间:14分钟在SwiftUI中,以单一数据源(single source of truth)为核心,构建了数据驱动状态更新的机制。其中引入了多种新的属性...
添加水印
qq_28101869的博客
07-22 222
//添加水印 public void ImgYin(String s,String ImgName){  try{  File _file = new File(ImgName);  Image src = ImageIO.read(_file);  int wideth=src.getWidth(null);  int height=src.getHeight(null);  Bu
iOS如何将工程内所有页面都加上全屏水印(工程里页面很多忘记哪个页面叫什么ViewController怎么办)
qq_15509071的博客
02-02 2903
分两步: 1.如何生成水印 参考https://www.jianshu.com/p/fd1800545513 2.水印add到哪个view上 水印add到哪个view上,尝试了三种: 第一种:hook uiview 的addsubview方法 ,使其全部透明,把tableview的layer 改为水印。 缺点:改造范围大,某些view无法过滤,有些不生效因为滑动时会layoutSubviews重新布局,某些白色背景圆角都会变成透明,不太好 第二种:UIViewControlle...
Swift 图片添加水印 logo + title
ZKReadStone的博客
10-22 883
func getWaterMark(_ originalImage: UIImage?,icon:UIImage?, title: String, andMark markFont: UIFont, andMark markColor: UIColor) -> UIImage? { let HORIZONTAL_SPACE: CGFloat = 130 let VERTICAL_SPACE: CGFloat = 150 var f
iOS水印的简单实现
weixin_30512043的博客
04-16 180
- (void)watermark { UIImage *oldImage = [UIImage imageNamed:@"事先准备好的图片,你将要在这帐图片上添加水印"]; UIGraphicsBeginImageContextWithOptions(oldImage.size, NO, 0.0); [oldImage drawInRect:C...
Swift 实现全屏水印的参考
yimiyangguang的专栏
12-10 3002
本文主要讨论的是给图片或者视图添加全屏水印。比较常见的是添加单个水印,这个比较好处理,网络上也有很多参考的方法。本文实现的是铺满的全屏水印
Swift 图片添加文字水印
SoulKey的博客
09-07 2864
新建个swift类,设置为UIImage的类别,UIImage对象调用该方法就返回添加水印之后的Image对象了 import Foundation import UIKit extension UIImage { func drawTextInImage()->UIImage { //开启图片上下文 UIGraphicsBeginImageContext
swiftui添加动画
最新发布
06-15
SwiftUI为我们提供了一种简单的方式来添加动画效果。下面是一个简单的例子,演示如何在SwiftUI中添加动画效果: ``` struct ContentView: View { @State private var isAnimating = false var body: some View { VStack { Text("Hello, World!") .scaleEffect(isAnimating ? 1.5 : 1) .animation(.default) .onTapGesture { self.isAnimating.toggle() } } } } ``` 在上面的代码中,我们使用了一个`@State`属性`isAnimating`来控制是否应用动画效果。当用户点击文本时,我们会在`onTapGesture`中切换`isAnimating`的值。`Text`视图使用`scaleEffect`来缩放文本,如果`isAnimating`为`true`,则将文本放大1.5倍。我们还使用`.animation(.default)`指定默认的动画效果。 当用户点击文本时,我们切换`isAnimating`的值,触发动画效果。在这个例子中,文本会缓慢地放大到1.5倍,然后缩小回原来的大小。 这只是SwiftUI中添加动画效果的一个简单例子,您可以使用更多的动画效果以及更复杂的视图层次结构来创建更复杂的动画效果。
写文章

热门文章

  • 心理知识分享 17789
  • Android Studio搭建Flutter教程 10096
  • 禁止APP录屏和截屏 9151
  • Studio 更新的时候提示Connection failed (connect timed out). Please check network connection and try again. 6993
  • adb wifi--不需要root 6780

分类专栏

  • kotlin 1篇
  • android组件 1篇
  • Android启动优化 2篇
  • flutter 1篇
  • java并发 6篇
  • adb使用 2篇
  • studio开发工具 15篇
  • Google Play 1篇
  • 浏览器--收藏夹 1篇
  • H5唤醒App 1篇
  • glide 1篇
  • AlarmManager 1篇
  • adb-wifi 1篇
  • 安卓--动画 1篇
  • 路由跳转 1篇
  • 图片压缩 1篇
  • eclipse 工具使用 2篇
  • 获取屏幕坐标 1篇
  • android 56篇
  • 面试题 4篇
  • api兼容 1篇
  • activity的启动模式 1篇
  • win10 2篇
  • expandListView 1篇
  • android,点9图 3篇
  • android,隐式启动,activity跳转 3篇
  • wps转
  • word转换为jpg
  • 内存分析 1篇

最新评论

  • adb wifi--不需要root

    龙潜月七: 每次重启都得要电脑 有没有不用电脑就能开启的啊?

  • Android10(API 29)getExternalStorageDirectory没权限解决

    吴牟人: 我的还是没有解决

  • ARouter::Compiler >>> No module name, for more information, look at gradle log

    天意__: 已解决

  • Hummer

    十一栀: 全网难得的hummer使用文章

  • flutter 修改状态栏的颜色

    老仙儿: Activity的onCreate()中

大家在看

  • 面向接口的方式进行CRUD
  • 如何优雅地将AI客服集成到企业网站或APP中 695
  • 基于python3.6读取jsonl文件,并保存到Mysql数据库 1024
  • 【信奥赛·算法基础】CSP-J 枚举算法 721
  • 《山东大学学报(理学版)》 292

最新文章

  • Recycleview的下拉刷新,上拉加载;侧滑删除
  • Android判断设备是Pad或手机
  • Glide加载图片,ImageView设置CenterCorp,圆角消失
2024年7篇
2023年25篇
2022年36篇
2021年57篇
2020年48篇
2019年10篇
2017年21篇
2016年14篇
2015年1篇
2012年1篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家中山玻璃钢雕塑性能可靠玻璃钢雕塑用什么原材料陇南玻璃钢雕塑安装新年商场门口美陈商场美陈吊天津大型商场创意商业美陈步骤通化春节商场美陈周口公园景观玻璃钢卡通雕塑各大商场圣诞美陈新年猪年商场美陈北京商场主题创意商业美陈湖里园林玻璃钢雕塑上海通道商场美陈哪家好玻璃钢雕塑保存雕塑玻璃钢glass清远玻璃钢马雕塑许昌玻璃钢雕塑厂家合肥梅州玻璃钢卡通雕塑高邮玻璃钢头像雕塑肇庆玻璃钢卡通雕塑尺寸玻璃钢孔子雕塑厂商定制浦东新区玻璃钢雕塑毕节商场美陈效果图山西景区玻璃钢雕塑公司广东商场美陈雕塑杭州玻璃钢雕塑哪家最好南昌玻璃钢树脂雕塑报价玻璃钢花盆雕塑好的有哪些玻璃钢花盆装饰柜玻璃钢骆驼雕塑哪里好香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化