開発メモ

開発関係のメモをいろいろと。たぶん。

NSImageをCore Graphicsで使う方法

NSImageだけでもいろいろな処理が出来ますが、いろいろと最適化されすぎてて逆に不便なこともたまにあります。そんな時には、Core Graphicsを使うことで、細かいところまで好きに操作することが出来ます。

動作を確認した環境

環境 情報
OS X 10.9.2
Xcode 5.1
Date 2014/04/03

使い方

具体的にはこんな感じで。

- (void)drawImage:(NSImage*)image toRect:(CGRect)to fromRect:(CGRect)from
{
    //     イメージの指定された範囲を指定された範囲に描画

    //     描画先の範囲が指定されてない場合、全体に描画
    
    if( CGRectIsEmpty( to ) )
        to.size = _size;

    //     描画元の範囲が指定されてない場合、全体を描画
    
    if( CGRectIsEmpty( from ) )
        from.size = sk4ImagePixelSize( image );

    //     実際の描画処理

    CGImageRef src_all = [image CGImageForProposedRect:NULL context:nil hints:nil];

    CGImageRef src_ref = CGImageCreateWithImageInRect( src_all, from );
    CGContextDrawImage( _context, to, src_ref );
    CGImageRelease( src_ref );
}

やってることは単純でCGImageForProposedRectでCGImageRefを取得。CGImageCreateWithImageInRectで必要な部分だけを切り出しています。あとは、Core Graphics系のAPIで普通に使うだけ。

簡単ですね。

備考

実装例

See_Ku / Minerba — Bitbucket
https://bitbucket.org/See_Ku/minerba