Core Graphics図面&2 d変形

8286 ワード

ツールバーの
iOS画像処理のCore GraphicsとOpenGL ES初見iOSは、Core Graphics/QuartZ 2 DとOpenGL ESの2つのグラフィックAPIファミリーをサポートしています.OpenGL ESはプラットフォームにまたがるグラフィックAPIであり、OpenGLの簡略化されたバージョンに属する.QuartZ 2 Dはアップル社が開発したAPIで、Core Graphics Frameworkの一部であり、CベースのAPIフレームワークであり、Quartzをグラフィックエンジンとして使用している.低レベル、軽量レベル、高忠実度の2 Dレンダリングを提供します.このフレームワークは、パスベースの描画、変換、カラー管理、スクリーンフリーレンダリング、テンプレート、グラデーション、マスク、画像データ管理、画像の作成、マスク、PDFドキュメントの作成、表示、解析に使用できます.
Core Graphicsのグラフィックコンテキスト(必須) Core Graphics (CGContextRef)、このグラフィックコンテキストは、各描画関数で使用されます.グラフィックコンテキストcontext:パラメータを持っている場合は、グラフィックコンテキストがあるのと同じです.このコンテキストは、図面を描くために必要なものかもしれません.グラフィックコンテキストを取得する3つの方法(drawRect:、drawRect:inContext:、UIGraphicsBeginImageContextWithOptions).
グラフィックの上下質問の取得
1.自分でピクチャタイプのコンテキストを作成します.
UIGraphicsBeginImageContextWithOptions関数を呼び出すと、画像を処理するためのグラフィックコンテキストが得られます.このコンテキストを使用すると、その上で絵を描き、画像を生成することができます.UIGraphicsGetImageFromCurrentImageContext関数を呼び出すと、現在のコンテキストからUIImgeオブジェクトを取得できます.すべての描画操作の後、UIGraphicsEndImageContext関数を呼び出してグラフィックコンテキストを閉じることを忘れないでください.
UIGraphicsBeginImageContextWithOptions(CGSizeMake(100,100), NO, 0);
CGContextRef con = UIGraphicsGetCurrentContext();
//  
....
UIImage* im = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

2.cocoaを使用して生成したグラフィックコンテキスト.
サブクラス化して独自のdrawRect:メソッドを実装すると、drawRect:メソッドが呼び出されると、Cocoaがグラフィックコンテキストを作成し、グラフィックコンテキストに対するすべての描画操作がUIViewに表示されます.
- (void) drawRect: (CGRect) rect 
 
- (void)drawLayer:(CALayer*)lay inContext:(CGContextRef)con

UIGraphicsBeginImageContextWithOptions関数またはdrawRect:メソッドに現在存在する場合、コンテキストは参照されません.Core Graphicsを使用するには、UIGraphicsGetCurrentContext関数を呼び出して現在のグラフィックコンテキストを取得できます.
contextRefグラフィックコンテキストで、グラフィックを描画
1.パスによる描画
//       
    CGContextRef context = UIGraphicsGetCurrentContext();


    //    
    CGPathRef path = CGPathCreateWithRect(CGRectMake(100, 100, 100, 100), nil);


    //    
    CGContextAddPath(context, path);

    //    
    CGContextSetRGBStrokeColor(context, 1.0, 0, 0, 1);

    //  
    CGContextDrawPath(context, kCGPathFillStroke);

    //    
    CGPathRelease(path);

CGcontextRefドキュメントの解析
CGContextRef context = UIGraphicsGetCurrentContext();                      
CGContextMoveToPoint     
CGContextAddLineToPoint    

CGContextAddEllipseInRect     
CGContextSetLineCap         
CGContextSetLineDash    
CGContextAddRect     
CGContextStrokeRect     
CGContextStrokeRectWithWidth        
CGContextStrokeLineSegments     


CGContextAddArc                             0      1    
CGContextAddArcToPoint(context,0,0, 2, 9, 40);//      point    1  ,   1   2              
CGContextSetShadowWithColor        
CGContextSetRGBFillColor       
CGContextSetRGBStrokeColor           
CGContextSetFillColorSpace          
CGConextSetStrokeColorSpace         
CGContextFillRect          rect
CGContextSetAlaha    


CGContextTranslateCTM       
CGContextSetLineWidth       
CGContextAddRects     
CGContextAddQuadCurveToPoint    
CGContextStrokePath       
CGContextDrawPath       
CGContextClosePath       
CGContextTranslateCTM(context, 0, rect.size.height);    
CGContextScaleCTM(context, 1.0, -1.0);          
CGContextSetInterpolationQuality            
CGImageCreateWithImageInRect         

CGContextEOFillPath                  
CGContextFillPath               
CGContextFillRect         
CGContextFillRects           
CGContextFillEllipseInRect            
CGContextDrawPath           ,kCGPathFill         ,kCGPathEOFill       ,kCGPathFillStroke    , kCGPathEOFillStroke    ,    

CGPathドキュメント解析
//Creating and Managing Paths
CGPathCreateMutable             。
CGPathCreateWithEllipseInRect               。
CGPathCreateWithRect                。
CGPathCreateWithRoundedRect               。
CGPathCreateCopy                  。
CGPathCreateCopyByTransformingPath                      。
CGPathCreateCopyByDashingPath              。
CGPathCreateCopyByStrokingPath               。
CGPathCreateMutableCopy                  。
CGPathCreateMutableCopyByTransformingPath                    。
CGPathRelease            
CGPathRetain                     。

//Modifying Quartz Paths
CGPathAddArc                 ,        。
CGPathAddRelativeArc                 ,        。
CGPathAddArcToPoint                ,        。
CGPathAddCurveToPoint      Bézier  é       。
CGPathAddLines                    。
CGPathAddLineToPoint                  。
CGPathAddPath                   。
CGPathAddQuadCurveToPoint       Bézier  é       。

CGPathAddRect         ,         。
CGPathAddRects              。
CGPathAddRoundedRect                 。
CGPathApply             ,           。
CGPathMoveToPoint                     ,       。
CGPathCloseSubpath                    。
CGPathAddEllipseInRect         ,          。

//Getting Information about Quartz Paths
CGPathEqualToPath                。
CGPathGetBoundingBox                    。
CGPathGetPathBoundingBox             
CGPathGetCurrentPoint              。
CGPathGetTypeID                       。
CGPathIsRect                   。
CGPathContainsPoint                 。
CGLineCap                。
CGLineJoin           。

2.文字列の描画
[self.title drawInRect:CGRectMake(0, 0, 100, 40) withAttributes:@{NSForegroundColorAttributeName:[UIColor redColor],NSFontAttributeName:[UIFont systemFontOfSize:15]}];

3.画像で絵を描く
    
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(100,100), NO, 0);
    
    UIImage *img = [UIImage imageNamed:@"1.png"];
    [img drawInRect:CGRectMake(0, 0, 50, 50)];
    UIImage *newImg = [UIImage imageNamed:@"2.png"];
    [newImg drawInRect:CGRectMake(60, 0, 60, 60)];
    
    UIImage* im = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    UIImageView *imageView = [[UIImageView alloc] initWithImage:im];
    imageView.frame = CGRectMake(100, 100, 200, 40);
    [self.view addSubview:imageView];

4.グラデーションの描画
   CGContextClip(context);
    CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
    CGFloat colors[] =    {  204.0 / 255.0, 224.0 / 255.0, 244.0 /  255.0, 1.00,
        29.0 / 255.0, 156.0 / 255.0, 215.0 / 255.0, 1.00, 0.0 /
        255.0,  50.0 / 255.0, 126.0 / 255.0, 1.00,
    };
    CGGradientRef gradient =CGGradientCreateWithColorComponents (rgb, colors, NULL, sizeof(colors)/(sizeof(colors[0])*4));
    CGColorSpaceRelease(rgb);
    CGContextDrawLinearGradient(context,gradient,CGPointMake(0.0,0.0),CGPointMake(0.0,self.frame.size.height), kCGGradientDrawsBeforeStartLocation);

CGAffineTransform-2 dひずみ
CGAffineTransformはcore graphicsフレームワークの下の構造体である.CGAffineTransformは、コントロールの平行移動、ズーム、回転などを変更できる変形を処理するクラスで、座標系は2次元座標系、すなわち右はx軸正方向、下はy軸正方向を採用している
CGAffineTransform UIViewで提供されているアニメーションメソッドを使用して、blockでtransformを変更するとアニメーション効果が得られます.
UIViewには、変形を制御するために使用されるtransformプロパティがあります.その使用方法は次のとおりです.
  • CGAffineTransformMakeTranslationは、初期位置を基準としてx軸方向にx単位、y軸方向にy単位
  • を平行移動することを実現する.
    //   
    CGAffineTransformMakeTranslation(CGFloat tx, CGFloat ty)
    //   
    self.demoImageView.transform = CGAffineTransformMakeTranslation(100, 100);
    

    注意:txが正の値の場合、x軸の正方向に平行移動し、逆にx軸の負方向に平行移動します.tyが正の値の場合、y軸の正方向に平行移動し、逆にy軸の負方向に平行移動する
  • CGAffineTransformMakeScaleは、初期位置を基準としてx軸方向にx倍、y軸方向にy倍
  • のスケーリングを実現する.
    //   
    CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)
    //   
    self.demoImageView.transform = CGAffineTransformMakeScale(2, 0.5);
    

    注意:sxが正の値の場合、x軸方向にx倍ズームされます.逆に、ズームに基づいて縦直線に沿って反転します.syが正の値の場合、y軸方向にy倍ズームされ、逆にズームされた上で水平線に沿って反転する
  • CGAffineTransformMakeRotationは初期位置を基準として座標系を反時計回りにangle弧度(弧度=π/180×角度、M_PI弧度は180角度を表す)
  • //   
    CGAffineTransformMakeRotation(CGFloat angle)
    //   
    self.demoImageView.transform = CGAffineTransformMakeRotation(M_PI*0.5);
    

    注1:angleが正の値の場合、反時計回りに座標系を回転させ、逆に時計回りに座標系を回転させる注2:反時計回りに座標系を回転させる表現は、コントロールを時計回りに回転させる
    そうたいひずみ
    CGAffineTransformTranslate(CGAffineTransform t, CGFloat tx, CGFloat ty)
    CGAffineTransformScale(CGAffineTransform t, CGFloat sx, CGFloat sy)
    CGAffineTransformRotate(CGAffineTransform t, CGFloat angle)
    

    drawRectメソッド手動呼び出し
    uiviewのプロパティ:setNeedsDisplay