fast code: from a "traditional" image buffer to NSImageView

April 2, 2008 - code

Just a fast code lesson:

gfx_data (uchar) –> our “traditional” RGB image buffer
IVFinalexture (NSImageView) –> where we want to view our image
bmp (NSBitmapImageRep) –> Temporal, to store the rgb buffer
img (NSImage) –> Temporal, to store the Bitmap

So the sequence (more or less) is:
uchar buffer –> NSBitmapImageRep –> NSImage –> NSImageView

unsigned char *gfx_data;
int gfx_width = 256;
int gfx_heigth = 256;
int gfx_samplespp = 3;

gfx_data = malloc (gfx_width*gfx_heigth*gfx_samplespp);
int i=0;
int max = gfx_width*gfx_heigth*gfx_samplespp;
for (i=0; i<(max);i+=3)
// Do your demoscene-fancy effect here
int valor = sin((float)i*4.0/(float)(gfx_width*gfx_heigth))*255.0;
if (valor<0) valor="valor*-1;
gfx_data[i]= valor;

// Convert buffer to NSBitmapImageRep
NSBitmapImageRep* bmp = [[NSBitmapImageRep alloc]initWithBitmapDataPlanes:&gfx_data
pixelsWide: gfx_width
pixelsHigh: gfx_heigth
bitsPerSample: 8
samplesPerPixel: gfx_samplespp
hasAlpha: NO
isPlanar: NO
colorSpaceName: NSCalibratedRGBColorSpace
bytesPerRow: (gfx_width*gfx_samplespp)
bitsPerPixel: 24];

// Store the NSBitmapImageRep in a NSImage structure
NSImage *img = [NSImage alloc];
[img addRepresentation:bmp];

// Set the NSImage into the NSImageView (IVFinaltexture)
if ([IVFinaltexture image]!=nil)
[[IVFinaltexture image] release];
[IVFinaltexture setImage:img];
//free (gfx_data); // WTF! system crashes if I uncomment this!
[bmp release];
[img release];

I think that I’ve some problems releasing the data, but I think that you can make an idea of the process, I’m not describing how to write code, just explaining a process to display an image buffer in Cocoa (in my opinion, not properly documented).


And… obviously… the result!!

.happy coding!!


Leave a Reply

Your email address will not be published. Required fields are marked *

spammer, go home! * Time limit is exhausted. Please reload the CAPTCHA.

This site uses Akismet to reduce spam. Learn how your comment data is processed.