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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章