.01 2012

UIViewの一部をUIImageとして取得する方法

こんにちわ。ネクストシステムの江原です!
 
最近は、仕事でHTML5+CSS3+javascriptで
iOS/Android向けWebアプリをメインでやってます。
Javascriptも面白いですね!!

今日は、UIViewの一部をUIImageとして取得する方法を調べたいと思います。

cnvViewToImg01.png 


1)  まずUIImageを作成する為作業する場所を確保します。
     作業する場所はユーザに見えてはいけないので
     オフスクリーン(見えない領域)に作成します。
cnvViewToImg02.png 

CGSize size = CGSizeMake( rect.size.width , rect.size.height );

UIGraphicsBeginImageContextWithOptions(size,NO,0.0); 

CGContextRef context = UIGraphicsGetCurrentContext();




2) UIViewの切取り開始位置を左上にあわせます。

CGPoint point = rect.origin;

CGAffineTransform affineMoveLeftTop
        CGAffineTransformMakeTranslation(
            -(int)point.x ,

            -(int)point.y );
CGContextConcatCTM( context , affineMoveLeftTop );
cnvViewToImg03.png 


3)左上にずらしたUIViewのイメージをオフスクリーンに貼付けます。

[(CALayer*)view.layer renderInContext:context];

UIImage *cnvImg = UIGraphicsGetImageFromCurrentImageContext();
cnvViewToImg04.png 
※ オフスクリーンのサイズを超える領域は削除される為
  最初に用意した矩形サイズの画像が取得できます。

4)オフスクリーンの破棄をしておしまいです。

UIGraphicsEndImageContext();




以下参考のソースです。

/** UIViewの一部をUIImageとして取得

 * @param view 対象のUIImage

 * @param rect 切り出したい位置とサイズ

 *

 * @return 対象のUIImage

 */

-(UIImage *)makeUIImageFromUIView:(UIView *)view

                         withRect:(CGRect)rect

{

        

    // オフスクリーン(見えない描画領域)を作成

    CGSize size = CGSizeMake( rect.size.width , rect.size.height );

    UIGraphicsBeginImageContextWithOptions(size,NO,0.0);
    // (補足:サイズ , NO:透過有 , 0.0:自動スケール です)

    // オフスクリーン(見えない領域)描画よりグラフィックスコンテキスト取得

    CGContextRef context = UIGraphicsGetCurrentContext();

    

    // 切り取り開始位置に合わせ

    // 左にpoint.x、上にpoint.y移動させるAffine変換を作成します。

    CGPoint point = rect.origin;

    CGAffineTransform affineMoveLeftTop
        = CGAffineTransformMakeTranslation(
            -(int)point.x ,

            -(int)point.y );

    // Affine変換を使用する為、コンテキストに設定

    CGContextConcatCTM( context , affineMoveLeftTop );

    

    // Viewの移動返還後のイメージをオフスクリーンに貼付けます。

    // (※ オフスクリーンからはみ出た領域は削除されるようです。

    [(CALayer*)view.layer renderInContext:context];

    

    

    // オフスクリーンの内容をUIImageとして取り出します。

    // (autoreleaseと思います)

    UIImage *cnvImg = UIGraphicsGetImageFromCurrentImageContext();

        

    // オフスクリーンを破棄します。

    UIGraphicsEndImageContext();

    

    return cnvImg;

    

}


毎日楽しく刺激的な日々で
こんな環境で仕事ができるチャンスがあることを本当に感謝しています。

このチャンスに甘えない様に
iOSのネイティブ開発とWeb開発の両方をこれからもがんばっていきたいと思います。

関連記事
スポンサーサイト



Comment

Post comment

  • comment
  • secret
  • 管理者にだけ表示を許可する

Trackback

trackbackURL:http://appteam.blog114.fc2.com/tb.php/235-631a3ca8

ブログ内検索

関連リンク

製品情報

最新記事

カテゴリ

プロフィール

neoxneo



NEXT-SYSTEM iOS Developers Blog


  • UTO:
    カナダ版iPhone4Sは、マナーモードでシャッター音がならない…


  • Ehara:
    ...


  • Hayate:
    ...


  • Tasaki:
    Developer登録完了...したのはいいけど


  • Ueda:
    ...



リンク