NSImageを加工して新しい画像を作りたいときなど、オフラインでさっと使えるBitmap領域を作ります。
使い方例
// 下記のサンプルクラスを読み込み
# import "BitmapBuffer.h"
// 初期化
BitmapBuffer *bitmapBuffer;
bitmapBuffer = [[BitmapBuffer alloc] initWithSize:NSMakeSize(640, 480)];
// 描画
// bitmapBuffer.context でコンテキストが取り出せるので、CGContextDrawなどに指定する
CGContextDrawImage(bitmapBuffer.context, NSRect, CGImage);
// 変換
NSImage *image = [bitmapBuffer NSImage];
CGImageRef cgImage = [bitmapBuffer createCGImage];
// 保存
[bitmapBuffer savePNGImageWithPath:savePath];
サンプルクラス
BitmapBuffer.h
# import <Foundation/Foundation.h>
@interface BitmapBuffer : NSObject {
unsigned char *bitmap;
CGContextRef bitmapContext;
CGSize bitmapSize;
}
@property (readonly) CGContextRef context;
// 任意のサイズでビットマップ領域を作ります
- (id)initWithSize:(NSSize)size;
// 内容をクリアします
- (void)clearBuffer;
// ビットマップ領域のサイズを返します
- (CGSize)size;
// ビットマップの内容をCGImageとして取り出します
- (CGImageRef)createCGImage;
// ビットマップの内容をNSImageとして取り出します
- (NSImage *)NSImage;
// ビットマップの内容をPNGに保存します
- (void)savePNGImageWithPath:(NSString *)filepath;
@end
BitmapBuffer.m
# import "BitmapBuffer.h"
@implementation BitmapBuffer
@synthesize context = bitmapContext;
# pragma mark - init / dealloc
- (id)initWithSize:(NSSize)size {
self = [super init];
if (self) {
bitmapSize = NSSizeToCGSize(size);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
bitmap = malloc(bitmapSize.width * bitmapSize.height * sizeof(unsigned char) * 4);
bitmapContext = CGBitmapContextCreate(bitmap,
bitmapSize.width,
bitmapSize.height,
8,
bitmapSize.width * 4,
colorSpace,
kCGImageAlphaPremultipliedFirst);
CGColorSpaceRelease(colorSpace);
}
return self;
}
- (void)dealloc {
free(bitmap);
CGContextRelease(bitmapContext);
[super dealloc];
}
-(void)clearBuffer {
CGRect clearRect = CGRectMake(0, 0, bitmapSize.width, bitmapSize.height);
CGContextClearRect(bitmapContext, clearRect);
CGContextSetFillColorWithColor(bitmapContext, CGColorGetConstantColor(kCGColorBlack));
CGContextFillRect(bitmapContext, clearRect);
}
- (CGSize)size {
return bitmapSize;
}
- (CGImageRef)createCGImage {
CGContextFlush(bitmapContext);
CGImageRef cgImage = CGBitmapContextCreateImage(bitmapContext);
[(id)cgImage autorelease];
return cgImage;
}
- (NSImage *)NSImage {
CGImageRef cgImage = [self createCGImage];
CGSize size = CGSizeMake(CGImageGetWidth(cgImage), CGImageGetHeight(cgImage));
NSImage *image = [[NSImage alloc] initWithCGImage:cgImage size:NSSizeFromCGSize(size)];
return [image autorelease];
}
- (void)savePNGImageWithPath:(NSString *)filepath {
CGImageRef cgImage = [self createCGImage];
NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCGImage:cgImage];
NSData *bitmapData = [bitmapRep representationUsingType:NSPNGFileType
properties:nil];
[bitmapData writeToFile:filepath atomically:YES];
[bitmapRep release];
}
@end