在NSBitmapImageRep上绘图

时间:2012-10-09 12:20:36

标签: macos cocoa drawing

我正在尝试创建内存中的图像,在上面绘图并保存到磁盘。

目前的代码是:

NSBitmapImageRep *rep = [[NSBitmapImageRep alloc]
                         initWithBitmapDataPlanes:NULL
                         pixelsWide:256
                         pixelsHigh:256
                         bitsPerSample:8
                         samplesPerPixel:4
                         hasAlpha:YES
                         isPlanar:YES
                         colorSpaceName:NSDeviceRGBColorSpace
                         bitmapFormat:NSAlphaFirstBitmapFormat
                         bytesPerRow:0
                         bitsPerPixel:8
                         ];


[NSGraphicsContext saveGraphicsState];
[NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithBitmapImageRep:rep]];

// Draw your content...
NSRect aRect=NSMakeRect(10.0,10.0,30.0,30.0);
NSBezierPath *thePath=[NSBezierPath bezierPathWithRect:aRect];
[[NSColor redColor] set];
[thePath fill];

[NSGraphicsContext restoreGraphicsState];


NSData *data = [rep representationUsingType: NSPNGFileType properties: nil];
[data writeToFile: @"test.png" atomically: NO];

在尝试绘制当前上下文时,我收到错误

CGContextSetFillColorWithColor: invalid context 0x0

这里有什么问题?为什么NSBitmapImageRep返回的上下文是NULL? 创建绘制图像并保存它的最佳方法是什么?

更新

最后来到以下解决方案:

NSImage *image = [[NSImage alloc] initWithSize:NSMakeSize(256, 256)];
[image lockFocus];

NSRect aRect=NSMakeRect(10.0,10.0,30.0,30.0);
NSBezierPath *thePath=[NSBezierPath bezierPathWithRect:aRect];
[[NSColor redColor] set];
[thePath fill];

[image unlockFocus];

NSData *data = [image TIFFRepresentation];
[data writeToFile: @"test.png" atomically: NO];

1 个答案:

答案 0 :(得分:5)

您的解决方法对于手头的任务是有效的,但是,它实际上比实际使 NSBitmapImageRep 更有效!有关讨论,请参阅http://cocoadev.com/wiki/NSBitmapImageRep

请注意[ NSGraphicsContext graphicsContextWithBitmapImageRep :]文档说:

  

“此方法仅接受单个平面NSBitmapImageRep实例。”

您正在使用isPlanar设置 NSBitmapImageRep :YES,因此使用多个平面...将其设置为NO - 您应该好好去!

换句话说:

NSBitmapImageRep *rep = [[NSBitmapImageRep alloc]
                     initWithBitmapDataPlanes:NULL
                     pixelsWide:256
                     pixelsHigh:256
                     bitsPerSample:8
                     samplesPerPixel:4
                     hasAlpha:YES
                     isPlanar:NO
                     colorSpaceName:NSDeviceRGBColorSpace
                     bitmapFormat:NSAlphaFirstBitmapFormat
                     bytesPerRow:0
                     bitsPerPixel:0
                     ];
// etc...