4

首先:我想用来NSBezierPath在我的应用程序中绘制一些简单的按钮图稿,所以我想我应该创建一个NSBitmapImageRep,获取 ,从中CGImage创建一个NSImage,然后在按钮上调用 setImage: 。如我错了请纠正我。

所以我去看看如何创建一个NSBitmapImage并发现了这个: **initWithBitmapDataPlanes:pixelsWide:pixelsHigh:bitsPerSample:samplesPerPixel:hasAlpha:isPlanar:colorSpaceName:bitmapFormat:bytesPerRow:bitsPerPixel:**

哇。

请记住,我正在寻找的是类似于 的东西initWithSize:,我应该为这些值添加什么?

4

3 回答 3

3

您不需要为数据平面分配空间。NSBitmapImageRep下面是创建一个带有 alpha 组件的空 32 位的调用。

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];
于 2014-08-05T06:13:54.520 回答
1

任何特殊原因,您都不是简单地NSImage通过使用焦点锁定将绘图代码括起来来创建新的并绘制到其中

NSImage* anImage = [[NSImage alloc] initWithSize:NSMakeSize(100.0,  100.0)];
[anImage lockFocus];

// Do your drawing here...

[anImage unlockFocus];

可可绘图指南是你的朋友,顺便说一句)

于 2014-08-05T05:57:09.823 回答
0

文档很好地解释了它。

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

于 2014-08-05T01:23:18.410 回答