西海岸より

つらつらざつざつと

CGImageRefからcontextへの描画方法

UIImageをcontextに描画させる際、以下のようにCGContextDrawImageを使ったコードの場合、imgRefで取り出した際にy軸が逆さになって表示されてしまう。

UIImage *image = [UIImage imageNamed:@"test.png"];
CGContextDrawImage(context, self.frame, image.CGImage);
CGImageRef imgRef = CGBitmapContextCreateImage(context);

この解決方法は以下の2通り。

contextへの描画時に座標系を変更

contextへの描画前に座標系を逆さにし、描画後に元に戻すという方法。

CGContextTranslateCTM( context,0.0,self.frame.size.height );
CGContextScaleCTM( context,1.0,-1.0 );
//imageをcontextへ描画
CGContextDrawImage(context, self.frame, image.CGImage);
CGContextTranslateCTM( context,0.0,self.frame.size.height );
CGContextScaleCTM( context,1.0,-1.0 );

コメントをつけないとわかりにくいコードになってしまう。

UIImageのdrawInRectメソッドを使う

UIImageにはdrawInRectというメソッドがあり、このメソッドによる描画では、上下が逆さになることが無い。

UIGraphicsBeginImageContext(self.frame.size);
CGContextRef context = UIGraphicsGetCurrentContext();
 .
 .
[image drawInRect:self.frame];
 .
 .
CGImageRef imgRef = CGBitmapContextCreateImage(context);
UIGraphicsEndImageContext();

どうやらCGImageRefによる描画では、生の画像データにアクセスすることになり、向きなどの情報が解釈されないという。
UIImageを当て込む場合の方法としては、後者の方が正しいようです。