生の画像データを表示する

方法(1) CGBitmapContextCreate() で作った CGContext から CGImage を作って表示

CGContextRef bitmapContext = CGBitmapContextCreate(buffer, ... );

CGContextRef context = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];
CGImageRef image = CGBitmapContextCreateImage(bitmapContext);
CGContextDrawImage(context, bitmapBounds, image);
CGImageRelease(image);

CGContext から CGImage を作る時は copy-on-write でおこなわれると思うよ、とどこかに書いてあった。

方法(2) CIImage を作って CIContext に表示

CIImage *image = [CIImage imageWithBitmapData:buffer ... ];
// もしくは方法(1)で作った CGImage から
// CIImage *image = [CIImage imageWithCGImage:cgImage];

CIContext* context = [CIContext contextWithCGContext: (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort] options:nil];
[context drawImage:image atPoint:point fromRect:rect];

この場合 NSOpenGLView に描画した方が効率がいいらしい。やりかたは /Developer/Examples/Quartz/Core Image/CIBevelSample などにある SampleCIView が参考になる。
CIImage の imageWithBitmapData:... で指定できる画像データのフォーマットは CGBitmapContextCreate() より少ないようだ。

方法(3) OpenGL を直接使う

glDrawPixels() か、テクスチャに登録するかして表示する。

glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, width, 0, height, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glEnable(GL_TEXTURE_2D);
glEnable(GL_TEXTURE_RECTANGLE_EXT); // 任意のサイズのテクスチャを使えるようにする。uvがピクセル座標になるので注意
GLuint textureId;
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_RECTANGLE_EXT, textureId);
glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA8, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, buffer);
glBegin(GL_QUADS);
{
  glTexCoord2f(0, height);
  glVertex2f(0, 0);

  glTexCoord2f(width, height);
  glVertex2f(width, 0);

  glTexCoord2f(width, 0);
  glVertex2f(width, height);

  glTexCoord2f(0, 0);
  glVertex2f(0, height);
}
glEnd();
glDisable(GL_TEXTURE_RECTANGLE_EXT);
glDisable(GL_TEXTURE_2D);

glFlush();

みたいな感じで。とてもはやい。http://developer.apple.com/samplecode/TextureRange/ も参照のこと。

方法(4) NSBitmapImageRep の initWithBitmapDataPlanes:...

NSBitmapImageRep Class Reference
フォーマットによっては