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也沒學得很精,如果有什麼文章有什麼錯誤,請大家幫忙指導改正。謝謝了。