一 、基本概念atom
圖形上下文(Graphics Context):是一個CGContextRef類型的數據spa
圖形上下文的做用:保存繪圖信息、繪圖狀態code
只要上下文不一樣,繪製的地方就不一樣。對象
本文說明如何把圖片繪製到Bitmap上面去,即要求生成一張圖片,圖片上面保存了繪圖信息。事件
Bitmap就是圖片,至關於系統的UIimage。一個UIImage就是一個Bitmap圖片
2、補充說明:ip
1.建立Bitmap圖形上下文的方法get
//方法1 UIGraphicsBeginImageContext(<#CGSize size#>);it
//方法2 UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale)io
使用兩個方法一樣均可以建立,可是使用第一個方法未來建立的圖片清晰度和質量沒有第二種方法的好。
方法2接收三個參數:
CGSize size:指定未來建立出來的bitmap的大小
BOOL opaque:設置透明YES表明透明,NO表明不透明
CGFloat scale:表明縮放,0表明不縮放
建立出來的bitmap就對應一個UIImage對象
3、代碼實例
// // ViewController.m // savePictre // // Created by emily on 16/1/8. // Copyright © 2016年 emily. All rights reserved. // #import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UIImageView *imageView; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; } //點擊按鈕事件 - (IBAction)btnClick:(UIButton *)sender { // 加載要裁剪的圖片 UIImage * image = [UIImage imageNamed:@"me"]; // 開啓一個比圖片稍大的圖形上下文(bitmap) CGFloat margin = 5; CGSize ctxSize = CGSizeMake(image.size.width + 2 * margin, image.size.height + 2 * margin); UIGraphicsBeginImageContextWithOptions(ctxSize, NO, 0.0); //獲取剛剛開啓的圖形上下文 CGContextRef ctx = UIGraphicsGetCurrentContext(); /**繪製一個圓環*/ //肯定圓心 CGPoint centerP = CGPointMake(ctxSize.width/2, ctxSize.height/2); CGFloat radius = MIN(image.size.width, image.size.height)/2; UIBezierPath * path1 = [UIBezierPath bezierPathWithArcCenter:centerP radius:radius startAngle:0 endAngle:2 * M_PI clockwise:YES]; CGContextAddPath(ctx, path1.CGPath); //設置線寬和顏色 [[UIColor yellowColor]set]; CGContextSetLineWidth(ctx, 5); //渲染 CGContextDrawPath(ctx, kCGPathStroke); /**繪製一個要裁剪的圓形*/ UIBezierPath * path2 = [UIBezierPath bezierPathWithArcCenter:centerP radius:radius startAngle:0 endAngle:2 * M_PI clockwise:YES]; CGContextAddPath(ctx, path2.CGPath); CGContextClip(ctx); //繪製圖片 [image drawAtPoint:CGPointMake(margin, margin)]; //從圖形上下文中獲取圖片 UIImage * getImage = UIGraphicsGetImageFromCurrentImageContext(); //得到屏幕的縮放比 CGFloat scale = [UIScreen mainScreen].scale; // 切割圖片 CGFloat x = 0; CGFloat y = (getImage.size.height - 2 * radius)/2; CGFloat h =2 * radius ; CGFloat w = 2 * radius; x *= scale; y *= scale; h *= scale; w *= scale; CGImageRef imageRef = CGImageCreateWithImageInRect(getImage.CGImage, CGRectMake(x, y,w , h)); getImage = [UIImage imageWithCGImage:imageRef]; //釋放 CGImageRelease(imageRef); //關閉圖形上下文 UIGraphicsEndImageContext(); //顯示圖片 self.imageView.image = getImage; //保存相冊 UIImageWriteToSavedPhotosAlbum(getImage, nil, nil, nil); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
Emily.Wang