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

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

作者: 浅宇落 | 来源:发表于2018-01-02 19:25 被阅读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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/odpqnxtx.html