LoginSignup
1
1

More than 5 years have passed since last update.

CoreGraphics をつかって画像を加工する(Mac OSX/iOS)

Last updated at Posted at 2015-03-30

CoreGraphicsを使ってJPEG等を加工するためのメモ。
NSImageとかUIImageとかの説明は省略。

Core Graphicsとは

Core Graphics は Mac OSX/iOSで使われるGrahics関連のフレームワーク。

CoreGraphics.frameworkを使って、CGXXXXといった名前のAPIを使う。

Core Foundation

  • CocoaのFoundationに相当するもの
  • C言語で記述されている
  • CFXXXという名前のAPI

CoreGraphics

CGImageRef

ビットマップイメージへの参照を表す型。

NSImage *image;
CGImageRef imageRef = [image CGImageForProposedRect:NULL context:nil hints:nil];

みたいに取得できる。
CGImageRefはいろんな関数が用意されており、
1行のバイト数は

size_t bytesPerRow = CGImageGetBytesPerRow(imageRef);

で取得可能。

CGImageRefからピクセル値を取得

CGImageRefのピクセル値を取得するには、
CGImageをCFDataとして扱える CGDataProviderRefに変換してあげる必要がある。

    CGDataProviderRef provider = CGImageGetDataProvider(imageRef);
    CFDataRef dataRef = CGDataProviderCopyData(provider);  /* CGDataProviderRefからCFDataRefとしてデータを取得 */
    CFMutableDataRef mDataRef = CFDataCreateMutableCopy(0, 0, dataRef); /* ピクセル値を加工するのにCFDataRefから複製 */
    void *pixels = (void *)CFDataGetBytePtr(mDataRef);

一度CFMutableDataRefにしないと、pixelsを操作するときにアクセス違反で落ちるので注意。

CGImageを作る

加工したGFDataを使った新しく画像を作り直すには、
CGImageCreateを使う

CGDataProviderRef resultDataProvider = CGDataProviderCreateWithCFData(mDataRef);
CGImageRef resultCgImage = CGImageCreate(CGImageGetWidth(imageRef),
                                        CGImageGetHeight(imageRef),
                                        CGImageGetBitsPerComponent(imageRef),
                                        CGImageGetBitsPerPixel(imageRef),
                                        bytesPerRow,
                                        CGImageGetColorSpace(imageRef),
                                        CGImageGetBitmapInfo(imageRef),
                                        resultDataProvider,
                                        NULL,
                                        CGImageGetShouldInterpolate(imageRef),
                                        CGImageGetRenderingIntent(imageRef));
NSBitmapImageRep *retImageRep = [[NSBitmapImageRep alloc] initWithCGImage:resultCgImage];
NSImage *resultImage = [[NSImage alloc] init];
[resultImage addRepresentation:retImageRep];

ちなみにつくったCFXXXXは CFRelease()を呼んであげることを忘れずに。

1
1
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
1
1