Core Graphics之CGContext詳解 (轉)

CGContext又叫圖形上下文,至關於一塊畫布,以堆棧形式存放,只有在當前 context上繪圖纔有效。iOS有分多種圖形上下文,其中UIView自帶提供的在drawRect:方法中經過 UIGraphicsGetCurrentContext獲取,還有專門爲圖片處理context,UIGraphicsBeginImageContext函數生成,還有pdf的context等等。函數


1.一共有3種使用context的場景,其中每種場景都有2種方法繪圖spa

場景1:.net

//經過UIView的子類的drawRect:在上下文中繪製,該方法系統已準備好一個cgcontext,並放置在上下文棧頂,rect形參就是context的尺寸大小
//當一個UIView的backgroundColor爲nil和opaque爲YES時,產生的context的背景就爲黑色的

- (void)drawRect:(CGRect)rect
{
    //1.使用UIKit在context上繪製,UIKit的全部操做只會在當前棧頂的context,因此須要注意當前棧頂的context是否你須要操做的上下文
    //UIImage,NSString,UIBezierPath,UIColor等能夠直接在當前context上操做

    UIImage* image = [UIImage imageNamed:@"test.png"];
    NSLog(@"size:%@",NSStringFromCGSize(image.size));
    //UIImage直接在context上操做,指定在context的哪一個座標上繪製,大小是原圖的尺寸,若是大小超出了context的範圍就會被截取掉
   // [image drawAtPoint:CGPointMake(100, 100)];
    //指定在context的哪一個座標上繪製,並指定繪製的圖片尺寸大小,這樣圖片的尺寸就會被壓縮,不會超出context範圍
    [image drawInRect:CGRectMake(0, 0, rect.size.width/2, rect.size.height/2)];
  
代理

   //2.使用Core Graphics的函數在context上繪製,Core Graphics的函數須要context做爲參數,只繪製在指定使用的context上
    //功過UIGraphicsGetCurrentContext函數獲取當前上下文棧頂的context,UIView系統已爲其準備好context並存放在棧頂了

//    CGContextRef context = UIGraphicsGetCurrentContext();
//    //畫一個橢圓
//    CGContextAddEllipseInRect(context, CGRectMake(0,0,100,100));
//    //填充顏色爲藍色
//    CGContextSetFillColorWithColor(context, [UIColor blueColor].CGColor);
//    //在context上繪製
//    CGContextFillPath(context);
blog

場景2:圖片

//實現該方法,用於CALayer回調,CALayer經過它的代理類來進行繪圖操做,切記千萬不能把UIView做爲CALayer的代理類,由於UIView自身有隱式的圖層,若再把顯式的圖層賦給它會發生不知名錯誤的
- (void)drawLayer:(CALayer*)layer inContext:(CGContextRef)ctx
{
    //1.使用UIKit進行繪製,由於UIKit只會對當前上下文棧頂的context操做,因此要把形參中的context設置爲當前上下文
    UIGraphicsPushContext(ctx);
    UIImage* image = [UIImage imageNamed:@"test.png"];
    //指定位置和大小繪製圖片
    [image drawInRect:CGRectMake(0, 0,100 , 100)];
    UIGraphicsPopContext();
    
    //    UIGraphicsPushContext(ctx);
    //2.使用Core Graphics進行繪製,須要顯式使用context
    //    //畫一個橢圓
    //    CGContextAddEllipseInRect(ctx, CGRectMake(0,0,100,100));
    //    //填充顏色爲藍色
    //    CGContextSetFillColorWithColor(ctx, [UIColor blueColor].CGColor);
    //    //在context上繪製
    //    CGContextFillPath(ctx);
    //    UIGraphicsPopContext();
}
ip


    LayerDelegate* delegate = [[LayerDelegate alloc]init];
    CALayer* layer = [CALayer layer];
    layer.anchorPoint = CGPointMake(0, 0);
    layer.position = CGPointMake(100, 100);
    layer.bounds = CGRectMake(0, 0, 200, 200);
    layer.delegate = delegate;
    //須要顯式調用setNeedsDisplay來刷新纔會繪製layer
    [layer setNeedsDisplay];
    [self.view.layer addSublayer:layer];
圖片處理


下圖爲場景1和場景2的顯示效果:it




場景3:io

 //經過本身建立一個context來繪製,一般用於對圖片的處理
    /*
     解釋一下UIGraphicsBeginImageContextWithOptions函數參數的含義:第一個參數表示所要建立的圖片的尺寸;第二個參 數用來指定所生成圖片的背景是否爲不透明,如上咱們使用YES而不是NO,則咱們獲得的圖片背景將會是黑色,顯然這不是我想要的;第三個參數指定生成圖片 的縮放因子,這個縮放因子與UIImage的scale屬性所指的含義是一致的。傳入0則表示讓圖片的縮放因子根據屏幕的分辨率而變化,因此咱們獲得的圖 片無論是在單分辨率仍是視網膜屏上看起來都會很好。
     */
    //該函數會自動建立一個context,並把它push到上下文棧頂,座標系也經處理和UIKit的座標系相同

    UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextAddEllipseInRect(context, CGRectMake(0,0,100,100));
    //填充顏色爲藍色
    CGContextSetFillColorWithColor(context, [UIColor blueColor].CGColor);
    //在context上繪製
    CGContextFillPath(context);
    //把當前context的內容輸出成一個UIImage圖片
    UIImage* i = UIGraphicsGetImageFromCurrentImageContext();
    //上下文棧pop出建立的context
    UIGraphicsEndImageContext();
    [i drawInRect:CGRectMake(0, 0, 100, 100)];


下圖爲繪製的顯示效果:




2.把整個屏幕轉化爲圖片

    UIImageView* imageV = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    UIGraphicsBeginImageContextWithOptions(imageV.frame.size, NO, 0);
    CGContextRef context = UIGraphicsGetCurrentContext();
    //把當前的整個畫面導入到context中,而後經過context輸出UIImage,這樣就能夠把整個屏幕轉化爲圖片
    [self.view.layer renderInContext:context];
    UIImage* image = UIGraphicsGetImageFromCurrentImageContext();
    imageV.image = image;
    UIGraphicsEndImageContext();


3.剪裁圖片

   //對一張圖片進行剪裁
    CGImageRef imageref = CGImageCreateWithImageInRect(image.CGImage, CGRectMake(100, 100, 200, 50));
    UIImageView* cropImage = [[UIImageView alloc]initWithFrame:CGRectMake(100, 300, 200, 50)];
    cropImage.image = [UIImage imageWithCGImage:imageref];

   CGImageRelease(imageref);

    [self.view addSubview:cropImage];


下圖下放的是剪裁後的圖片效果:

 

原文:http://blog.csdn.net/kingsley_cxz/article/details/9191479

相關文章
相關標籤/搜索