Re: Capturing the Content of a IKImageBrowserView
Re: Capturing the Content of a IKImageBrowserView
- Subject: Re: Capturing the Content of a IKImageBrowserView
- From: Thomas Goossens <email@hidden>
- Date: Wed, 9 Jan 2008 17:24:07 +0100
Hello Anthony,
This is because the IKImageBrowserView renders itself into an openGL
surface.
So you can't retrieve the pixels using the usual AppKit code path.
But instead you can try this:
//1) allocate a c buffer at the size of the visible rect of the image
browser
NSRect vRect = [yourImageBrowserView visibleRect];
NSSize size = vRect.size;
void *buffer = malloc(size.width * size.height * 4);
//2) read the pixels using openGL
[yourImageBrowserView lockFocus];
glReadPixels(0,
0,
size.width,
size.height,
GL_RGBA,
GL_UNSIGNED_BYTE,
buffer);
[yourImageBrowserView unlockFocus];
//3) create a bitmap with those pixels
unsigned char *planes[2];
planes[0] = (unsigned char *) (buffer);
NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc]
initWithBitmapDataPlanes:planes pixelsWide:size.width
pixelsHigh:size.height bitsPerSample:8 samplesPerPixel:4 hasAlpha:YES
isPlanar:NO colorSpaceName:NSDeviceRGBColorSpace bitmapFormat:0
bytesPerRow:size.width*4 bitsPerPixel:32];
//4) create a temporary image with this bitmap and set it flipped
(because openGL and the AppKit don't have the same pixels coordinate
system)
NSImage *img = [[NSImage alloc] initWithSize:size];
[img addRepresentation:imageRep];
[img setFlipped:YES];
[imageRep release];
//5) draw this temporary image into another image so that we get an
image without any reference to our "buffer" buffer so that we can
release it after that
NSImage *finalImage = [[NSImage alloc] initWithSize:size];
[finalImage lockFocus];
[img drawAtPoint:NSZeroPoint
fromRect:NSMakeRect(0,0,size.width,size.height)
operation:NSCompositeCopy fraction:1.0];
[finalImage unlockFocus];
//6) release intermediate objects
[img release];
free(buffer);
-- Thomas.
On Jan 9, 2008, at 5:00 PM, Anthony Mittaz wrote:
Hello,
I'm currently trying to capture the content of a IkImageBrowserView
but the image resulting from this operation is always blank.
My code:
[MyIkImageBrowserView lockFocus];
NSBitmapImageRep *imageRep = [MyIkImageBrowserView
bitmapImageRepForCachingDisplayInRect:[MyIkImageBrowserView frame]];
[MyIkImageBrowserView cacheDisplayInRect:[MyIkImageBrowserView
frame] toBitmapImageRep:imageRep];
[MyIkImageBrowserView unlockFocus];
NSImage *image = [[NSImage alloc]
initWithSize:sizeOfMyIkImageBrowserView];
[image addRepresentation:imageRep];
[imageViewOfTheView setImage:image];
If someone could give me a better solution i would be more than happy.
Thanks
Anthony Mittaz
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden