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: Thu, 10 Jan 2008 11:36:45 +0100
I had a look to you screenshot and in fact you have the shadows in
your NSImage.
But this shadows are very hard to see because the greys are slightly
different.
So this is probably a colorspace issue.
In my sample code I'm using NSDeviceRGBColorSpace to create the
NSBitmapImageRep.
I'm not an expert of colorspaces so maybe I'm wrong here.
You should try to use a different colorspace when creating the bitmap,
or you can also try the alternate solution suggested by alexander.
-- Thomas.
On Jan 10, 2008, at 5:03 AM, Anthony Mittaz wrote:
Thanks this works well except that when I'm using this code the
resulting image has no shadow under each browser item.
Is there anything i can add to this code the get back my shadows ;-)
Here You can see the original IKImageBrowser and the resulting image.
http://web.mac.com/sync/Site/IKImageBrowserViewProblem.html
On 10/01/2008, at 2:24 AM, Thomas Goossens wrote:
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