LoginSignup
3
3

More than 5 years have passed since last update.

CGContextRef

Last updated at Posted at 2016-03-16

グラフィックコンテキスト

 グラフィックスコンテキスト(単にコンテキストと言ったりするのかな)とは、描画内容のデータ(とでも考えたらいいのだろうか)のことで、構造体となっている。CGContextRefはその構造体へのポインタ。

次の関数は、(現在描画対象となっている)カレントグラフィックコンテキストを取得する。

CGContextRef UIGraphicsGetCurrentContext();

UIViewdrawRect:内でこの関数を呼ぶことによって、そのUIViewのグラフィックコンテキストを取得できる。

 リファレンスによると、

カレントグラフィックスコンテキストは、デフォルトではnilとなっています。
ビューオブジェクトは、drawRect:メソッドを呼ぶに先立って、有効なコンテキストをスタックにプッシュし、それをカレントとします。
描画を行うにあたりUIViewを利用しなかったとしても、UIGraphicsPushContext関数を手動で呼び出すことによって有効なコンテキストをスタックにプッシュしなければなりません。

ということなので、この関数はスタックに積まれているコンテキストの一番上のコンテキストを返す。ということとなる。

 次の関数はカレントグラフィックコンテキストに対して描画を行う。

void UIRectFill(CGRect rect)
void UIRectFrame(CGRect rect)
void UIRectFillUsingBlendMode(CGRect rect, CGBlendMode blendMode)
void UIRectFrameUsingBlendMode(CGRect rect, CGBlendMode blendMode)
void UIRectClip(CGRect ret)

関連
 UIGraphicsPushContext
 UIGraphicsPopContesxt

 カレントでないコンテキストに対する描画関数は引数でコンテキストを指定する。そのような関数がいっぱいあり、通常は、上記のUIGraphicsGetCurrentContext()でカレントを取得したうえで、それらの関数で細かい描画を行う。(ようだ)

コンテキストの形式

コンテキストには用途によっていろいろ種類があるようだ。
PDF用のコンテキストとか...
画面表示用のコンテキストにはビットマップ形式のものが用いられる。(形式というよりビットマップデータが付随している感じ?)

次の関数のようにビットマップデータの情報を取得したりするものは、ビットマップ形式のコンテキストのみに利用できる。(ビットマップ形式でないコンテキストを渡すとエラーや警告が発生する。)

void *CGBitmapContextGetData(CGContextRef context)
size_t CGBitmapContextGetWidth(CGContextRef context)
size_t CGBitmapContextGetHeight(CGContextRef context)
size_t CGBitmapContextGetBitsPerComponent(CGContextRef context)
size_t CGBitmapContextGetBitsPerPixel(CGContextRef context)
size_t CGBitmapContextGetBytesPerRow(CGContextRef context)
CGColorSpaceRef CGBitmapContextGetColorSpace(CGContextRef context)
CGImageAlphaInfo CGBitmapContextGetAlphaInfo(CGContextRef context)
CGBitmapInfo CGBitmapContextGetBitmapInfo(CGContextRef context)

コンテキストの作成

次の二つの関数のうちいずれかを使うが、どう使い分けるの?
(1)

CGContextRef CGBitmapContextCreate(void *data, size_t width, size_t height, size_t bitsPerComponent, size_t bytesPerRow)

ビットマップ形式のコンテキストを作成する。
得られるコンテキストはカレントではない。
この関数で作成したコンテキストを利用した後は、次の関数により解放する。

void CGContextRelease(CGContextRef context)

(2)

void UIGraphicsBeginImageContext(CGSize size)

ビットマップ形式のコンテキストを作成し、カレントとする。
見ての通りこの関数はコンテキストを返さないので、コンテキストを取得する際は、UIGraphicsGetCurrentContextを利用する。
この関数で作成したコンテキストを利用した後は、次の関数によりコンテキストを破棄する。

void UIGraphicsEndImageContext()

また、作成したコンテキストから次の関数でUIImageを取得できる。

UIImage * UIGraphicsGetImageFromCurrentImageContext()

UIImageで取得できることで、pngファイルとしてもとりだすことができる。
これが最大の利点なのでしょうか?

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3