抱歉, 上一版本出现点错误:
忽略了模板图片的原来尺寸, 我的模板图片的尺寸是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