如何使用iOS实现图片水印与封装
创始人
2024-12-19 19:41:40
0次

首先我们了解一下什么是水印及其作用?

水印:在图片上加的防止他人盗图的半透明logo、文字、图标

水印的作用:告诉你这个图片从哪来的,主要是一些网站为了版权问题、广告而添加的。

核心代码:

将字符串添加到图形上下文的方法- (void)drawAtPoint:(CGPoint)point withAttributes:(nullable NSDictionary *)attrs- (void)drawInRect:(CGRect)rect withAttributes:(nullable NSDictionary *)attrs将字符串添加到图形上下文的方法- (void)drawAtPoint:(CGPoint)point;              // mode = kCGBlendModeNormal, alpha = 1.0- (void)drawAtPoint:(CGPoint)point blendMode:(CGBlendMode)blendMode alpha:(CGFloat)alpha;- (void)drawInRect:(CGRect)rect;               // mode = kCGBlendModeNormal, alpha = 1.0- (void)drawInRect:(CGRect)rect blendMode:(CGBlendMode)blendMode alpha:(CGFloat)alpha;

基本步骤:

//1. 要手动创建一个位图上下文,创建位图上下文时,要指定大小,指定的大小,决定着生成图片的尺寸是多大void UIGraphicsBeginImageContext(CGSize size);//2. 把内容绘制到上下文当中//2.1绘制原始图片//2.2绘制文字//2.3绘制logo//3. 从上下文当中生成一张图片,把上下文当中绘制的所有内容合成在一起生成一张跟上下文尺度一样的图片UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext() ;//4.手动创建的上下文一定要手动去销毁掉UIGraphicsEndImageContext() ;

封装的实例代码:

SWWaterMarkImage.h

#import NS_ASSUME_NONNULL_BEGIN@interface SWWaterMarkImage : UIImage-(UIImage *)WaterImageWithImage:(UIImage *)image ImageLogo:(UIImage *)imageLogo title:(NSString *)string ;+(UIImage *)WaterImageWithImage:(UIImage *)image ImageLogo:(UIImage *)imageLogo title:(NSString *)string ;@endNS_ASSUME_NONNULL_END

SWWaterMarkImage.m

@implementation SWWaterMarkImage-(UIImage *)WaterImageWithImage:(UIImage *)image ImageLogo:(UIImage *)imageLogo title:(NSString *)string { //1.要手动创建一个位图上下文 UIGraphicsBeginImageContext(image.size) ; //2.绘制到内容上下文中 //原始图片渲染 [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)]; //文字 NSDictionary *attributeDict = @{         NSFontAttributeName : [UIFont systemFontOfSize:20.f],         NSForegroundColorAttributeName:[UIColor whiteColor],//         NSBackgroundColorAttributeName :[UIColor redColor]         } ; CGRect rectSize = [string boundingRectWithSize:CGSizeMake(MAXFLOAT, 30) options:NSStringDrawingUsesDeviceMetrics attributes:attributeDict context:nil] ; CGFloat x = image.size.width - rectSize.size.width - 10 ; CGFloat y = image.size.height - 30 ; [string drawAtPoint:CGPointMake(x, y) withAttributes:attributeDict] ; //logo图片 CGFloat waterW = 30; CGFloat waterH = 30; CGFloat waterX = x - waterW - 10 ; CGFloat waterY = y - 3 ; [imageLogo drawInRect:CGRectMake(waterX, waterY, waterW, waterH)] ; //3.从当前的上下文当中生成一张新的图片 UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext() ; //4.手动创建的上下文一定要手动去销毁掉 UIGraphicsEndImageContext() ; return newImage ;}+(UIImage *)WaterImageWithImage:(UIImage *)image ImageLogo:(UIImage *)imageLogo title:(NSString *)string { return [[self alloc]WaterImageWithImage:image ImageLogo:imageLogo title:string] ;}@end

ViewController.m

#import "ViewController.h"#import "SWWaterMarkImage.h"@interface ViewController ()@property(nonatomic,strong)UIImageView *imageView ;@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; //生成一张加水印图片步骤: /*  可以在任何方法中生成图片,不一定在drawRect:方法中生成  1.要手动创建一个位图上下文,创建位图上下文时,要指定大小,指定的大小,决定着生成图片的尺寸是多大  2.把内容绘制到上下文当中  3.从上下文当中生成一张图片,把上下文当中绘制的所有内容合成在一起生成一张跟上下文尺度一样的图片  4.手动创建的上下文一定要手动去销毁掉  */}-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ UIImage *newImage = [SWWaterMarkImage WaterImageWithImage:[UIImage imageNamed:@"18d8bc3eb13533fa65021ddba5d3fd1f40345b8b"] ImageLogo:[UIImage imageNamed:@"logo"] title:@"芜湖亚原子网络科技有限公司"] ; //5.将生成的image显示到imageView上去 self.imageView = [[UIImageView alloc]init] ; self.imageView.frame = CGRectMake(0, 100, 375, 250) ; self.imageView.image = newImage ; [self.view addSubview:self.imageView] ;}@end

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...