如何利用Quartz2D给图片添加水印

众所周知,Quartz2D是高级的、二维的绘图引擎。Quartz 2D是基于分辨率的和设备无关的,你不需要考虑最终的目的地。
Quartz 2D API很容易使用,并且提供了很强的特性,例如透明layer,基于路径的绘制,offscreen渲染、高级颜色管理、抗锯齿渲染,和PDF document创建、显示和转换等。

Quartz 2D API是Core Graphics框架的一部份。


言归正传,怎么使用Quartz给图片加水印呢?

总的来说分为5步

1.创建一个位图,并设置背景图片(原图)

2..设置水印并添加到位图上

3.获取完成后的图片

4.关闭位图上下文的编辑

5.显示在view中


当我们创建位图时,系统自动为我们获取好了上下文,无需再创建.

我们首先在声明文件中声明一个ImageView,方便我们赋值使用

<span style="font-size:18px;">@interface ViewController ()

@property (nonatomic, strong) UIImageView *BitMapimage;

@end</span>


然后我们在viewDidLoad方法中创建一个UIImageView

<span style="font-size:18px;">- (void)viewDidLoad {
    [super viewDidLoad];
    
   //创建ImageView
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10, 300, 100)];
    [self.view addSubview:imageView];
    self.BitMapimage = imageView;
}</span>


准备工作做好了 开始我们的第一步

//1.创建一张位图并设置背景图片及尺寸

首先我们先了解一个方法  

UIGraphicsBeginImageContextWithOptions

函数原型为

<span style="font-size:18px;">UIKIT_EXTERN void     UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale) NS_AVAILABLE_IOS(4_0);</span>

其中有三个参数 :size,opaque,scale

Size : 是设置位图的大小,一般设置为背景图片的大小即可

OPaque : 是Alpha通道值,即透明度 YES表示为不透明,NO表示为透明,一般设置为NO,显示效果最好

Scale:是缩放因子,决定最后你显示的位图的比例 公式为(width * scale)  * (height * scale)  例如你的位图大小为 50 * 50  ,设置的scale为2.0时,实际的显示尺寸则为(50*2.0) * (50*2.0) 

<span style="font-size:18px;">UIImage *bgImage = [UIImage imageNamed:@"scene"];//scene
    
    /**
     *  size是位图的大小
     *  opaque是alpha通道透明度,YES为不透明,NO为透明,设置为NO,效果最佳
     *  scale 是缩放因子 
     */
    UIGraphicsBeginImageContextWithOptions(bgImage.size, NO, 0.0);
    [bgImage drawInRect:CGRectMake(0, 0, bgImage.size.width, bgImage.size.height)];</span>

其次是第二步

//2.设置水印并添加到位图上

UIImage *waterImage = [UIImage imageNamed:@"logo"];
    
    //设置水印位置
    CGFloat waterW = bgImage.size.width * 0.2;
    CGFloat waterH = bgImage.size.width * 0.2;
    CGFloat waterX = bgImage.size.width - waterW;
    CGFloat waterY = bgImage.size.height - waterH;
    
    [waterImage drawInRect:CGRectMake(waterX, waterY, waterW, waterH)];


接下来第三步

//3.获取目标文件

//返回的是一张修改之后的图片
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();

第四步

//4.关闭位图的上下文

   //关闭位图的上下文编辑 ,因为这个函数的返回值为空,直接调用即可 
UIGraphicsEndImageContext();

最后一步

//5.显示在View上

//5.显示
    self.BitMapimage.image = newImage;

======================================分割线 以下是源码=============================================

//  ViewController.m
//  添加水印


#import "ViewController.h"

@interface ViewController ()

@property (nonatomic, strong) UIImageView *BitMapimage;
@end

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    
    //1.创建一张位图并设置背景图片
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10, 300, 100)];
    [self.view addSubview:imageView];
    self.BitMapimage = imageView;
    UIImage *bgImage = [UIImage imageNamed:@"scene"];//scene
    
    /**
     *  size是位图的大小
     *  opaque是alpha通道透明度,YES为不透明,NO为透明,设置为NO,效果最佳
     *  scale 是缩放因子 (20 * scale) * (20 * scale) 屏幕尺寸比例 设置为0.0
     */
    UIGraphicsBeginImageContextWithOptions(bgImage.size, NO, 0.0);
    [bgImage drawInRect:CGRectMake(0, 0, bgImage.size.width, bgImage.size.height)];
    //2.画水印
    UIImage *waterImage = [UIImage imageNamed:@"logo"];
    
    //设置水印位置
    CGFloat waterW = bgImage.size.width * 0.2;
    CGFloat waterH = bgImage.size.width * 0.2;
    CGFloat waterX = bgImage.size.width - waterW;
    CGFloat waterY = bgImage.size.height - waterH;
    
    [waterImage drawInRect:CGRectMake(waterX, waterY, waterW, waterH)];
    //3.从上下文获取当前正在编辑的图片
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    //4.关闭位图的上下文
    UIGraphicsEndImageContext();
    //5.显示
    self.BitMapimage.image = newImage;
    
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
OK,结束。


刚开博客,OC也没学得很精,如果有什么文章有什么错误,请大家帮忙指导改正。谢谢了。


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值