Swift 图片添加水印 logo + title

3 篇文章 0 订阅
2 篇文章 0 订阅
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 font: UIFont? = markFont
            if font == nil {
                font = UIFont.systemFont(ofSize: 23)
            }
            var color: UIColor? = markColor
            if color == nil {
                color = UIColor.blue
            }
            //原始image的宽高
            guard let viewWidth = originalImage?.size.width, let viewHeight = originalImage?.size.height else { return nil }
            //为了防止图片失真,绘制区域宽高和原始图片宽高一样
            UIGraphicsBeginImageContext(CGSize(width: viewWidth, height: viewHeight))
            //先将原始image绘制上
            originalImage?.draw(in: CGRect(x: 0, y: 0, width: viewWidth, height: viewHeight))
            //sqrtLength:原始image的对角线length。在水印旋转矩阵中只要矩阵的宽高是原始image的对角线长度,无论旋转多少度都不会有空白。
            let sqrtLength = sqrt(viewWidth * viewWidth + viewHeight * viewHeight)
            let attrStr = NSAttributedString(string: title, attributes: [NSAttributedString.Key.foregroundColor : markColor, NSAttributedString.Key.font: markFont])
            //绘制文字的宽高
            let strWidth = attrStr.size().width
            let strHeight = attrStr.size().height
            
            //开始旋转上下文矩阵,绘制水印文字
            let context = UIGraphicsGetCurrentContext()
            
            //将绘制原点(0,0)调整到源image的中心
            context?.concatenate(CGAffineTransform(translationX: viewWidth / 2, y: viewHeight / 2))
            //以绘制原点为中心旋转
            context?.concatenate(CGAffineTransform(rotationAngle: CGFloat(Double.pi / 7.0)))
            //将绘制原点恢复初始值,保证当前context中心和源image的中心处在一个点(当前context已经旋转,所以绘制出的任何layer都是倾斜的)
            context?.concatenate(CGAffineTransform(translationX: -viewWidth / 2, y: -viewHeight / 2))
            
            //计算需要绘制的列数和行数
            let horCount: Int = Int(sqrtLength / CGFloat(strWidth + HORIZONTAL_SPACE)) + 1
            let verCount: Int = Int(sqrtLength / CGFloat(strHeight + VERTICAL_SPACE)) + 1
            //此处计算出需要绘制水印文字的起始点,由于水印区域要大于图片区域所以起点在原有基础上移
            let orignX: CGFloat = -(sqrtLength - viewWidth) / 2
            let orignY: CGFloat = -(sqrtLength - viewHeight) / 2
            //在每列绘制时X坐标叠加
            var tempOrignX: CGFloat = orignX
            //在每行绘制时Y坐标叠加
            var tempOrignY: CGFloat = orignY
            let iconW = icon != nil ? strHeight : 0
            let iconL = iconW == 0 ? 0 : iconW + 5
            for i in 0..<horCount * verCount {
                if icon != nil {
                    icon?.draw(in: CGRect(x: tempOrignX, y: tempOrignY, width: strHeight, height: strHeight), blendMode: CGBlendMode.hardLight, alpha: 0.9)
                }
                title.draw(in: CGRect(x: tempOrignX+iconL, y: tempOrignY, width: strWidth, height: strHeight), withAttributes: [NSAttributedString.Key.foregroundColor : markColor, NSAttributedString.Key.font: markFont])
                if i % horCount == 0 && i != 0 {
                    tempOrignX = orignX + ( i%2 == 0 ? (strWidth+HORIZONTAL_SPACE)*0.5 : 0)//是否隔行错开
                    tempOrignY += strHeight + VERTICAL_SPACE
                } else {
                    tempOrignX += strWidth + HORIZONTAL_SPACE
                }
            }
            //根据上下文制作成图片
            let finalImg: UIImage? = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            return finalImg
        }

借鉴博文

实现效果:在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值