首先:我想使用NSBezierPath
在我的应用程序中绘制一些简单的按钮艺术品,所以我想我应该创建一个NSBitmapImageRep
,获得CGImage
,创建一个NSImage
,然后调用setImage:在按钮上。如果我说错了请指正。
所以我去看看如何创建一个NSBitmapImage
,发现如下:**initWithBitmapDataPlanes:pixelsWide:pixelsHigh:bitsPerSample:samplesPerPixel:hasAlpha:isPlanar:colorSpaceName:bitmapFormat:bytesPerRow:bitsPerPixel:**
哇。
记住我正在寻找的是沿着initWithSize:
的线条的东西,我应该为这些值放什么?
不需要为数据平面分配空间。下面是创建一个空的32位NSBitmapImageRep
和一个alpha组件的调用。
NSBitmapImageRep *newRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL
pixelsWide:pixelsWide
pixelsHigh:pixelsHigh
bitsPerSample:8
samplesPerPixel:4
hasAlpha:YES
isPlanar:NO
colorSpaceName:NSDeviceRGBColorSpace
bytesPerRow:4 * pixelsWide
bitsPerPixel:32];
有什么特殊的原因吗?你没有简单地创建一个新的NSImage
,并通过将你的绘图代码与焦点锁定括起来,比如
NSImage* anImage = [[NSImage alloc] initWithSize:NSMakeSize(100.0, 100.0)];
[anImage lockFocus];
// Do your drawing here...
[anImage unlockFocus];
(可可绘图指南是你的朋友,顺便说一下)
文档对此解释得很好。
planes
参数有点令人困惑。它基本上是一个指向像素指针的指针。因此,如果你有一个数组中的像素由一个名为"pixels"的变量指向,就像这样:
unsigned char* pixels = malloc (width * height * 4); // assumes ARGB 8-bit pixels
NSBitmapImageRep* myImageRep = [[NSBitmapImageRep alloc] initWithDataPlanes:&pixels
... etc...];
其余参数非常简单。pixelWidth
和pixelHeight
正是你所期望的。其他值都对应于数据的排列方式。您是否使用每通道8位的ARGB数据?还是每个通道32位的RGBA ?
NSDeviceRGBColorSpace
可能足以满足您对颜色空间的使用。
isPlanar
通道应该是NO
,如果你在传递一个指针到你的图像数据