生の画像データを表示する
- OS X 10.5.4
方法(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
フォーマットによっては