3

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

当前代码是:

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];
4

1 回答 1

5

您的解决方法对手头的任务有效,但是,它比实际让NSBitmapImageRep工作更昂贵!请参阅http://cocoadev.com/wiki/NSBitmapImageRep进行一些讨论。

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

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

您正在使用 isPlanar:YES 设置您的NSBitmapImageRep,因此它使用多个平面...将其设置为 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...
于 2012-11-29T00:47:00.860 回答