Re: Scaling an NSImage to have exact pixel dimensions
Re: Scaling an NSImage to have exact pixel dimensions
- Subject: Re: Scaling an NSImage to have exact pixel dimensions
- From: Ken Thomases <email@hidden>
- Date: Fri, 10 Oct 2014 00:51:57 -0500
On Oct 9, 2014, at 11:57 PM, Carl Hoefs <email@hidden> wrote:
> On Oct 9, 2014, at 8:05 PM, Ken Thomases <email@hidden> wrote:
>
>> Create an NSBitmapImageRep with the appropriate properties. Create an NSGraphicsContext from that bitmap image rep using +[NSGraphicsContext graphicsContextWithBitmapImageRep:]. Make that graphics context current. Draw the image. Flush and restore the graphics context. Get the data from the bitmap image rep in an image file format using -representationUsingType:properties: or (if you really want TIFF) -TIFFRepresentationUsingCompression:factor:.
>
> Awesome pointers, I got it to work! The tricky part was the actual scaling. It would crop but not scale, so resorted to using CIImage. If there’s a cleaner way, please let me know!
What did you try? If you are starting with an NSImage, you can just draw it using one of the -drawInRect:… methods.
> NSRect imgRect = NSMakeRect(0.0, 0.0, 640.0, 480.0);
> NSSize imgSize = imgRect.size;
> NSBitmapImageRep *offscreenRep = [[NSBitmapImageRep alloc]
> initWithBitmapDataPlanes:NULL
> pixelsWide:imgSize.width
> pixelsHigh:imgSize.height
> bitsPerSample:8
> samplesPerPixel:4
> hasAlpha:YES
> isPlanar:NO
> colorSpaceName:NSDeviceRGBColorSpace
> bitmapFormat:NSAlphaFirstBitmapFormat
> bytesPerRow:8*4*imgSize.width
I recommend that you pass 0 for bytesPerRow. This lets the system optimize the buffer alignment. (It's also one less thing to get wrong.)
> bitsPerPixel:32];
> // set offscreen context
> NSGraphicsContext *gc = [NSGraphicsContext graphicsContextWithBitmapImageRep:offscreenRep];
> [NSGraphicsContext saveGraphicsState];
> [NSGraphicsContext setCurrentContext:gc];
>
> // scale the image from cgRect down to imgRect
> CIImage *ciImage = [CIImage imageWithData:dataObj];
> CGRect cgRect = [ciImage extent];
> [[gc CIContext] drawImage:ciImage inRect:imgRect fromRect:cgRect];
>
> // reset the current context
> [NSGraphicsContext restoreGraphicsState];
>
> // create an NSImage and add the rep to it
> NSImage *img = [[NSImage alloc] initWithSize:imgSize];
> [img addRepresentation:offscreenRep];
> NSLog(@"* Final Image: %@",img);
Why did you create an NSImage? Just for testing? I was under the impression that you wanted image-file-format data.
> Thanks again!
You're welcome. I'm glad I could help.
Cheers,
Ken
_______________________________________________
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