圖片添加文字水印

LEWatermark.h文件

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface LEWatermark : NSObject

/**
 添加字符串水印到圖片,水印大小根據(jù)圖片大小等比設(shè)置

 @param originalImage 需要添加水印的圖片
 @param text 水印字符串
 @param scale 水印的大小比例,默認(rèn)1
 @return 添加了水印的圖片
 */
+ (UIImage *)watermardImageWithImage:(UIImage *)originalImage text:(NSString *)text watermardScale:(CGFloat)scale;

/**
 添加屬性文本水印到圖片

 @param originalImage 需要添加水印的圖片
 @param title 水印屬性文本
 @param horizontalSpace 水印水平間隔
 @param verticalSpace 水印豎直間隔
 @param angle 水印旋轉(zhuǎn)弧度
 @return 添加了水印的圖片
 */
+ (UIImage *)watermardImageWithImage:(UIImage *)originalImage watermark:(NSAttributedString *)title horizontalSpace:(CGFloat)horizontalSpace verticalSpace:(CGFloat)verticalSpace angle:(CGFloat)angle;

@end

NS_ASSUME_NONNULL_END

LEWatermark.m文件

#import "LEWatermark.h"


@implementation LEWatermark

// 水印按比例圖片大小的比例設(shè)置
+ (UIImage *)watermardImageWithImage:(UIImage *)originalImage text:(NSString *)text watermardScale:(CGFloat)scale {
    CGFloat viewWidth = originalImage.size.width;
    CGFloat viewHeight = originalImage.size.height;
    CGFloat min = MIN(viewWidth, viewHeight);
    CGFloat inScale = min / 1242 * scale;
    
    CGFloat horizzontalSpace = 200.0 * inScale;
    CGFloat verticalSpace = 150.0 * inScale;
    CGFloat angle = (M_PI_2/ -2);
    
    CGFloat fontSize = MAX(10, (70 * inScale));
    NSShadow *shadow = [[NSShadow alloc] init];
    [shadow setShadowOffset:CGSizeMake(5 * inScale, 8 * inScale)];
    shadow.shadowColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.6];
    
    //文字的屬性
    NSDictionary *attr = @{
                           // 設(shè)置字體大小
                           NSFontAttributeName : [UIFont systemFontOfSize:fontSize],
                           // 設(shè)置文字顏色
                           NSForegroundColorAttributeName : [UIColor colorWithRed:1 green:1 blue:1 alpha:0.2],
                           // 設(shè)置陰影
                           NSShadowAttributeName : shadow
                           };
    NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:text attributes:attr];
    UIImage *image = [LEWatermark watermardImageWithImage:originalImage watermark:attrStr horizontalSpace:horizzontalSpace verticalSpace:verticalSpace angle:angle];
    return image;
}

// 基礎(chǔ)方法
+ (UIImage *)watermardImageWithImage:(UIImage *)originalImage watermark:(NSAttributedString *)title horizontalSpace:(CGFloat)horizontalSpace verticalSpace:(CGFloat)verticalSpace angle:(CGFloat)angle {
    if (!originalImage) {
        return originalImage;
    }
    
    if (!title || title.length == 0) {
        return originalImage;
    }
    
    //原始image的寬高
    CGFloat viewWidth = originalImage.size.width;
    CGFloat viewHeight = originalImage.size.height;
    
    //為了防止圖片失真,繪制區(qū)域?qū)捀吆驮紙D片寬高一樣
    UIGraphicsBeginImageContext(CGSizeMake(viewWidth, viewHeight));
    //先將原始image繪制上
    [originalImage drawInRect:CGRectMake(0, 0, viewWidth, viewHeight)];
    //sqrtLength:原始image的對(duì)角線length。在水印旋轉(zhuǎn)矩陣中只要矩陣的寬高是原始image的對(duì)角線長(zhǎng)度,無(wú)論旋轉(zhuǎn)多少度都不會(huì)有空白。
    CGFloat sqrtLength = sqrt(viewWidth*viewWidth + viewHeight*viewHeight);
    //繪制文字的寬高
    CGFloat strWidth = title.size.width;
    CGFloat strHeight = title.size.height;
    
    //開(kāi)始旋轉(zhuǎn)上下文矩陣,繪制水印文字
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    //將繪制原點(diǎn)(0,0)調(diào)整到源image的中心
    CGContextConcatCTM(context, CGAffineTransformMakeTranslation(viewWidth/2, viewHeight/2));
    //以繪制原點(diǎn)為中心旋轉(zhuǎn)
    CGContextConcatCTM(context, CGAffineTransformMakeRotation(angle));
    //將繪制原點(diǎn)恢復(fù)初始值,保證當(dāng)前context中心和源image的中心處在一個(gè)點(diǎn)(當(dāng)前context已經(jīng)旋轉(zhuǎn),所以繪制出的任何layer都是傾斜的)
    CGContextConcatCTM(context, CGAffineTransformMakeTranslation(-viewWidth/2, -viewHeight/2));
    
    //計(jì)算需要繪制的列數(shù)和行數(shù)
    int horCount = sqrtLength / (strWidth + horizontalSpace) + 1;
    int verCount = sqrtLength / (strHeight + verticalSpace) + 1;
    
    //此處計(jì)算出需要繪制水印文字的起始點(diǎn),由于水印區(qū)域要大于圖片區(qū)域所以起點(diǎn)在原有基礎(chǔ)上移
    CGFloat orignX = -(sqrtLength-viewWidth)/2;
    CGFloat orignY = -(sqrtLength-viewHeight)/2;
    
    //在每列繪制時(shí)X坐標(biāo)疊加
    CGFloat tempOrignX = orignX;
    //在每行繪制時(shí)Y坐標(biāo)疊加
    CGFloat tempOrignY = orignY;
    for (int i = 0; i < horCount * verCount; i++) {
        [title drawInRect:CGRectMake(tempOrignX, tempOrignY, strWidth, strHeight)];
        if (i % horCount == 0 && i != 0) {
            tempOrignX = orignX;
            tempOrignY += (strHeight + verticalSpace);
        }else{
            tempOrignX += (strWidth + horizontalSpace);
        }
    }
    //根據(jù)上下文制作成圖片
    UIImage *finalImg = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    CGContextRestoreGState(context);
    return finalImg;
}



@end

核心代碼來(lái)自:http://www.itdecent.cn/p/054468e95a11

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 加水印的方式有很多,比如給圖片添加圖片水印、文字水印,或者給視頻添加圖片水印、文字水印。本文首先講解如何給圖片添加...
    金絲楠閱讀 22,542評(píng)論 9 20
  • 功能需求 在圖片的給定位置上添加文字水印 水印可以旋轉(zhuǎn)和設(shè)置透明度 先說(shuō)說(shuō)自己的實(shí)現(xiàn)思路: 先創(chuàng)建具有透明背景色的...
    雪飛鴻閱讀 2,412評(píng)論 2 15
  • 話不多說(shuō),直接上代碼講解 在我的項(xiàng)目里,水印文字是大小不同的字體拼接的,所有這里也是對(duì)這種水印文字進(jìn)行的處理。
    路在腳下了閱讀 3,580評(píng)論 0 1
  • 幾米在《星空》里寫(xiě)到:“我常常一個(gè)人,走很長(zhǎng)的路,在起風(fēng)的時(shí)候覺(jué)得自己像一片落葉?!?/div>
    二或君閱讀 306評(píng)論 0 0
  • 有段時(shí)間,我很厭惡生活,看不到快樂(lè),感受不到開(kāi)心。嚴(yán)重到什么程度?不愿與人交流,不愿上課,不愿學(xué)習(xí),甚至不愿吃飯不...
    至此今夕閱讀 1,095評(píng)論 12 23

友情鏈接更多精彩內(nèi)容