iOS 本地/网络图片打水印(图片和文字)

2018-01-02  本文已影响0人  浅宇落

抱歉, 上一版本出现点错误:

忽略了模板图片的原来尺寸, 我的模板图片的尺寸是1170*2296, 忘记处理了, 导致下面的内容出现了偏差, 在这版中已解决.


图片打水印的需求越来越多, 下面我们就来探讨一下.

我是用的技术是Quartz2D.

1.创建一个UIImage的类别

1.1 在.h文件中定义一个方法, 方便外界调用

/**

 为本地图片添加水印

 @param markImage添加的水印图片

 @param markImageRect添加的水印图片的区域

 @param markName添加的水印文字

 @param markNameRect添加的水印文字的区域

 @return绘制好的水印图片

 */

- (instancetype)waterMarkImage:(UIImage *)markImage markImageRect:(CGRect)markImageRect markName:(NSString *)markName markNameRect:(CGRect)markNameRect;

// ============== 添加的内容 ============== 

/**

 为网络图片添加水印

 @param markNetworkImageName添加的网络水印图片网址

 @param markImageRect加的网络水印图片的区域

 @param markName添加的水印文字

 @param markNameRect添加的水印文字的区域

 @return绘制好的水印图片

 */

- (instancetype)waterMarkNetworkImageName:(NSString *)markNetworkImageName markImageRect:(CGRect)markImageRect markName:(NSString *)markName markNameRect:(CGRect)markNameRect;

// ============== 添加的内容 =============

1.2 在.m文件中实现此方法

//本地水印图片

- (instancetype)waterMarkImage:(UIImage *)markImage markImageRect:(CGRect)markImageRect markName:(NSString *)markName markNameRect:(CGRect)markNameRect{

// ============== 修改过的内容 ============== 

//错误写法    CGSize size = self.size;

//正确写法

CGSize size = [UIScreen mainScreen].bounds.size;

// ============== 修改过的内容 ============== 

    //开启图片上下文

    UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);

    //绘制目标图片

    [self drawInRect:CGRectMake(0, 0, size.width, size.height)];

    //绘制水印图片

    [markImagedrawInRect:markImageRect];

    NSDictionary *attr = @{NSFontAttributeName: [UIFont boldSystemFontOfSize:17],  //设置字体

                NSForegroundColorAttributeName : [UIColor redColor]  //设置字体颜色

                           };

    //绘制水印文字

    [markNamedrawInRect:markNameRect withAttributes:attr];

    //获取绘制后的图片

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

    //关闭图片上下文

    UIGraphicsEndPDFContext();

    return image;

}

//网络水印图片

 - (instancetype)waterMarkNetworkImageName:(NSString *)markNetworkImageName markImageRect:(CGRect)markImageRect markName:(NSString *)markName markNameRect:(CGRect)markNameRect {

  //网络的水印图片

 NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:markNetworkImageName]]; UIImage *markImage = [UIImage sd_imageWithData:data];

 return [self waterMarkImage:markImage markImageRect:markImageRect markName:markName markNameRect:markNameRect];

 }

2.创建一个UIImageView的类别

2.1 在.h文件中定义一个方法, 方便外界调用

/**

 获取水印图片

 @param targetImage图片模板

 @param markImageName添加的水印图片(网络获取)

 @param markImageRect添加的水印图片的区域

 @param markName添加的水印文字

 @param markNameRect添加的水印文字的区域

 */

- (void)setWaterMarkTargettImage:(UIImage *)targetImage markImageName:(NSString *)markImageName markImageRect:(CGRect)markImageRect markName:(NSString *)markName markNameRect:(CGRect)markNameRect;

2.2 在.m文件中实现此方法

- (void)setWaterMarkTargettImage:(UIImage *)targetImage markImageName:(NSString *)markImageName markImageRect:(CGRect)markImageRect markName:(NSString *)markName markNameRect:(CGRect)markNameRect {

    //默认的水印图片

    UIImage *placeholderImage = [UIImage imageNamed:@"easyicon"];

    [self sd_setImageWithURL:[NSURL URLWithString:markImageName] placeholderImage:targetImage completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {

        UIImage *waterImage = image ? image : placeholderImage;

         self.image = [targetImage waterMarkImage:waterImage markImageRect:markImageRect markName:markName markNameRect:markNameRect];

    }];

}

3.在控制器里调用UIImage/UIImageView定义的方法

//网络图片地址

    NSString *url = @"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1514900854889&di=6172e4aef493d8b2e74589da2d0b1251&imgtype=0&src=http%3A%2F%2Fpic13.nipic.com%2F20110419%2F6782757_171000681191_2.jpg";

    // =======================  绘制本地水印图片  =======================

    //图片模板

    UIImage *image = [UIImage imageNamed:@"liutao"];

    //添加的水印图片

    UIImage *waterImage = [UIImage imageNamed:@"easyicon"];

    //添加的水印图片的rect

// ============== 修改过的内容 ============== 

    CGFloat waterImageH = kWaterImageH * waterImage.size.height / waterImage.size.width;

    CGRect waterImageRect = CGRectMake(kScrrentW - kWaterImageH, 0, kWaterImageH, waterImageH);

    //添加的网络水印图片的rect

    CGRect waterNetworkImageRect = waterImageRect;

// ============== 修改过的内容 ============== 

    //添加的水印文字的rect

    CGRect waterNameRect = CGRectMake((kScrrentW - 100) / 2.0, 10, 200, 30);

    //加载绘制本地水印后的图片

    //self.imageView.image = [image waterMarkImage:waterImage markImageRect:waterImageRect markName:@"刘涛女神" markNameRect:waterNameRect];

    //加载绘制网络水印后的图片

    self.imageView.image = [image waterMarkNetworkImageName:url markImageRect:waterNetworkImageRect markName:@"刘涛女神" markNameRect:waterNameRect];

    // =======================  绘制网络水印图片  =======================

    //[self.imageView setWaterMarkTargettImage:image markImageName:url markImageRect:waterImageRect markName:@"刘涛女神" markNameRect:waterNameRect];

结果

如有错误请指出, 共同改正

Demo地址: 本地图片/网络图片打水印(文字和图片)Demo

上一篇下一篇

猜你喜欢

热点阅读