NSBitmapImageRepクラスを使うとビットマップ画像を自作することが出来て面白いです。ただ最近はレティーナ対応の関係もあるので、描画周りを意識する場合はNSBezierPathの利用を検討してみるのも良いかと思います。
NSBitmapImageRepをNSImageに変換する方法
残念ながら専用のイニシャライザーはありません。 そのためまずは空のNSImageを作成し、addRepresentationメソッドでNSBitmapImageRepを追加するという方法をとります。
NSBitmapImageRep *rep = ...;
NSImage *img = [NSImage.alloc initWithSize:rep.size];
[img addRepresentation:rep];
なお、add系メソッドを用いていることから分かるように、複数のNSBitmapImageRepを追加することも出来ます。レティーナ対応を行う際には元のNSBitmapImageRepに加えて、二倍のサイズで作成したNSBitmapImageRepをaddRepresentationしてあげると良いです。
こういうのはダメ。
NSImage *img = [NSImage.alloc initWithData:rep.TIFFRepresentation]; // Nooo!
昔ネットで見つけたコードですが、NSDataへの変換コストとNSImageへの変換コストが二重に発生するので相当重たい処理になります。
今週の一言
NSBitmapImageRepのイニシャライザ名が長すぎて困る
initWithBitmapDataPlanes:
で始まる例のあの人です。初めて見た時にはものすごくシュールに感じましたが、今はなんともないんですよね。慣れって恐ろしいですね。
このメソッドのことをネットで調べていると、word-wrapが効かずにサイトデザインが崩れてるページがあったりしてなんとも言えない気持ちになります。
-(instancetype)initWithBitmapDataPlanes:(unsigned char **)planes pixelsWide:(NSInteger)width pixelsHigh:(NSInteger)height bitsPerSample:(NSInteger)bps samplesPerPixel:(NSInteger)spp hasAlpha:(BOOL)alpha isPlanar:(BOOL)isPlanar colorSpaceName:(NSString *)colorSpaceName bitmapFormat:(NSBitmapFormat)bitmapFormat bytesPerRow:(NSInteger)rBytes bitsPerPixel:(NSInteger)pBits {
return [super initWithBitmapDataPlanes:planes pixelsWide:width pixelsHigh:height bitsPerSample:bps samplesPerPixel:spp hasAlpha:alpha isPlanar:isPlanar colorSpaceName:colorSpaceName bitmapFormat:bitmapFormat bytesPerRow:rBytes bitsPerPixel:pBits];
}
// おいおい、勘弁してくれよ。こいつがメソッド名なら俺は今ごろアメリカ合衆国大統領だぜ(意味不明)