众所周知,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>
<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也没学得很精,如果有什么文章有什么错误,请大家帮忙指导改正。谢谢了。