如何从头开始创建NSBitmapImageRep



首先:我想使用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...];

其余参数非常简单。pixelWidthpixelHeight正是你所期望的。其他值都对应于数据的排列方式。您是否使用每通道8位的ARGB数据?还是每个通道32位的RGBA ?

NSDeviceRGBColorSpace可能足以满足您对颜色空间的使用。

isPlanar通道应该是NO,如果你在传递一个指针到你的图像数据

相关内容

  • 没有找到相关文章

最新更新