抱歉, 上一版本出現(xiàn)點錯誤:
忽略了模板圖片的原來尺寸, 我的模板圖片的尺寸是1170*2296, 忘記處理了, 導(dǎo)致下面的內(nèi)容出現(xiàn)了偏差, 在這版中已解決.
圖片打水印的需求越來越多, 下面我們就來探討一下.
我是用的技術(shù)是Quartz2D.
1.創(chuàng)建一個UIImage的類別
1.1 在.h文件中定義一個方法, 方便外界調(diào)用
/**
?為本地圖片添加水印
?@param markImage添加的水印圖片
?@param markImageRect添加的水印圖片的區(qū)域
?@param markName添加的水印文字
?@param markNameRect添加的水印文字的區(qū)域
?@return繪制好的水印圖片
?*/
- (instancetype)waterMarkImage:(UIImage *)markImage markImageRect:(CGRect)markImageRect markName:(NSString *)markName markNameRect:(CGRect)markNameRect;
// ============== 添加的內(nèi)容?==============?
/**
?為網(wǎng)絡(luò)圖片添加水印
?@param markNetworkImageName添加的網(wǎng)絡(luò)水印圖片網(wǎng)址
?@param markImageRect加的網(wǎng)絡(luò)水印圖片的區(qū)域
?@param markName添加的水印文字
?@param markNameRect添加的水印文字的區(qū)域
?@return繪制好的水印圖片
?*/
- (instancetype)waterMarkNetworkImageName:(NSString *)markNetworkImageName markImageRect:(CGRect)markImageRect markName:(NSString *)markName markNameRect:(CGRect)markNameRect;
// ============== 添加的內(nèi)容?=============
1.2 在.m文件中實現(xiàn)此方法
//本地水印圖片
- (instancetype)waterMarkImage:(UIImage *)markImage markImageRect:(CGRect)markImageRect markName:(NSString *)markName markNameRect:(CGRect)markNameRect{
// ============== 修改過的內(nèi)容?==============?
//錯誤寫法? ? CGSize size = self.size;
//正確寫法
CGSize size = [UIScreen mainScreen].bounds.size;
// ============== 修改過的內(nèi)容?==============?
? ? //開啟圖片上下文
? ? UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);
? ? //繪制目標圖片
? ? [self drawInRect:CGRectMake(0, 0, size.width, size.height)];
? ? //繪制水印圖片
? ? [markImagedrawInRect:markImageRect];
? ? NSDictionary *attr = @{NSFontAttributeName: [UIFont boldSystemFontOfSize:17],? //設(shè)置字體
? ? ? ? ? ? ? ? NSForegroundColorAttributeName : [UIColor redColor]? //設(shè)置字體顏色
?? ? ? ? ? ? ? ? ? ? ? ? ? };
? ? //繪制水印文字
? ? [markNamedrawInRect:markNameRect withAttributes:attr];
? ? //獲取繪制后的圖片
? ? UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
? ? //關(guān)閉圖片上下文
? ? UIGraphicsEndPDFContext();
? ? return image;
}
//網(wǎng)絡(luò)水印圖片
?- (instancetype)waterMarkNetworkImageName:(NSString *)markNetworkImageName markImageRect:(CGRect)markImageRect markName:(NSString *)markName markNameRect:(CGRect)markNameRect {
? //網(wǎng)絡(luò)的水印圖片
?NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:markNetworkImageName]];?UIImage *markImage = [UIImage sd_imageWithData:data];
?return [self waterMarkImage:markImage markImageRect:markImageRect markName:markName markNameRect:markNameRect];
?}
2.創(chuàng)建一個UIImageView的類別
2.1 在.h文件中定義一個方法, 方便外界調(diào)用
/**
?獲取水印圖片
?@param targetImage圖片模板
?@param markImageName添加的水印圖片(網(wǎng)絡(luò)獲取)
?@param markImageRect添加的水印圖片的區(qū)域
?@param markName添加的水印文字
?@param markNameRect添加的水印文字的區(qū)域
?*/
- (void)setWaterMarkTargettImage:(UIImage *)targetImage markImageName:(NSString *)markImageName markImageRect:(CGRect)markImageRect markName:(NSString *)markName markNameRect:(CGRect)markNameRect;
2.2 在.m文件中實現(xiàn)此方法
- (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.在控制器里調(diào)用UIImage/UIImageView定義的方法
//網(wǎng)絡(luò)圖片地址
? ? 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
// ============== 修改過的內(nèi)容?==============?
? ? CGFloat waterImageH = kWaterImageH * waterImage.size.height / waterImage.size.width;
? ? CGRect waterImageRect = CGRectMake(kScrrentW - kWaterImageH, 0, kWaterImageH, waterImageH);
? ? //添加的網(wǎng)絡(luò)水印圖片的rect
? ? CGRect waterNetworkImageRect = waterImageRect;
// ============== 修改過的內(nèi)容?==============?
? ? //添加的水印文字的rect
? ? CGRect waterNameRect = CGRectMake((kScrrentW - 100) / 2.0, 10, 200, 30);
? ? //加載繪制本地水印后的圖片
? ? //self.imageView.image = [image waterMarkImage:waterImage markImageRect:waterImageRect markName:@"劉濤女神" markNameRect:waterNameRect];
? ? //加載繪制網(wǎng)絡(luò)水印后的圖片
? ? self.imageView.image = [image waterMarkNetworkImageName:url markImageRect:waterNetworkImageRect markName:@"劉濤女神" markNameRect:waterNameRect];
? ? // =======================? 繪制網(wǎng)絡(luò)水印圖片? =======================
? ? //[self.imageView setWaterMarkTargettImage:image markImageName:url markImageRect:waterImageRect markName:@"劉濤女神" markNameRect:waterNameRect];
如有錯誤請指出, 共同改正