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()
を呼んであげることを忘れずに。