Jonathan Taylor wrote:
> I'm working with 16-bit grayscale images, and for the most part I'm just
> manipulating bits within NSBitmapImageRep objects. However for convenience it
> would be nice to do some stuff with NSImages, particularly when rescaling and
> suchlike. The problem is that whenever I draw into such an NSImage it gets
> converted to 3x8 bit RGB. Is there a simple way I can force things to stay
> grayscale, or am I fighting a losing battle here.
You are not fighting a losing battle, you use the wrong methods to create an
NSBitmapImageRep with properties you want.
If you want to create an NSImage/NSImageRep with special properties: there is a
rule of thumb: don't use lockFocus.
--> Re: bad behavior from unlockFocus on 10.6 by Ken Ferry.
Another rule of thumb is: if you need -[NSImage TIFFRepresentation] you do
something wrong.
(There are of course counterexamples).
The following code does (I hope so) what you want:
NSImage *srcImage = [[NSImage alloc] initWithContentsOfFile:thePath];
// create a new empty NSBitmapImageRep
NSBitmapImageRep *newRep = [[NSBitmapImageRep alloc]
initWithBitmapDataPlanes:NULL
pixelsWide: (NSInteger)newWidth
pixelsHigh: (NSInteger)newHeight
bitsPerSample: 16
samplesPerPixel: 1
hasAlpha: NO // YES is not supported
isPlanar: NO
colorSpaceName: NSCalibratedWhiteColorSpace
bytesPerRow: 0
bitsPerPixel: 0];
//Now save the current NSGraphicsContext and set a new one
[NSGraphicsContext saveGraphicsState];
NSGraphicsContext *newContext = [NSGraphicsContext
graphicsContextWithBitmapImageRep: newRep];
[NSGraphicsContext setCurrentContext: newContext];
[srcImage drawInRect:NSMakeRect( 0, 0, [newRep pixelsWide], [newRep
pixelsHigh] )
fromRect:NSZeroRect
operation:NSCompositeCopy
fraction:1.0];
// Restore the previous graphics context and state.
[NSGraphicsContext restoreGraphicsState];
and see what the newRep looks like:
NSLog( @"newRep is:%@", newRep );
This code creates a 16 bit grayscale image whatever the source image is.
Good luck
Heinrich
_______________________________________________
Cocoa-dev mailing list ([email protected])
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:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com
This email sent to [email protected]