我遵循了Apple 的 Quartz 编程指南(清单 2-5)中的示例代码,并且(在更正了代码中的几个错别字之后,比如calloc
只使用一个应该是的参数malloc
)我在我的上面定义了这个函数@implementation
:
CGContextRef MyCreateBitmapContext (int pixelsWide, int pixelsHigh){
CGContextRef context = NULL;
CGColorSpaceRef colorSpace;
void * bitmapData;
int bitmapByteCount;
int bitmapBytesPerRow;
bitmapBytesPerRow = (pixelsWide * 4);// 1
bitmapByteCount = (bitmapBytesPerRow * pixelsHigh);
colorSpace = CGColorSpaceCreateDeviceRGB();
bitmapData = malloc( bitmapByteCount );// 3
if (bitmapData == NULL)
{
fprintf (stderr, "Memory not allocated!");
return NULL;
}
context = CGBitmapContextCreate (bitmapData,// 4
pixelsWide,
pixelsHigh,
8, // bits per component
bitmapBytesPerRow,
colorSpace,
kCGImageAlphaPremultipliedLast);
if (context== NULL)
{
free (bitmapData);// 5
fprintf (stderr, "Context not created!");
return NULL;
}
CGColorSpaceRelease( colorSpace );// 6
return context;// 7
}
然后我有一个方法如下:
-(void)testDrawCG{
CGRect myBoundingBox;// 1
CGContextRef myBitmapContext;
CGImageRef myImage;
myBoundingBox = CGRectMake (100, 100, 100, 100);// 2
myBitmapContext = MyCreateBitmapContext (400, 300);// 3
// ********** Your drawing code here ********** // 4
CGContextSetRGBFillColor (myBitmapContext, 1, 0, 0, 1);
CGContextFillRect (myBitmapContext, CGRectMake (0, 0, 200, 100 ));
CGContextSetRGBFillColor (myBitmapContext, 0, 0, 1, .5);
CGContextFillRect (myBitmapContext, CGRectMake (0, 0, 100, 200 ));
myImage = CGBitmapContextCreateImage (myBitmapContext);// 5
CGContextDrawImage(myBitmapContext, myBoundingBox, myImage);// 6
char *bitmapData = CGBitmapContextGetData(myBitmapContext); // 7
CGContextRelease (myBitmapContext);// 8
if (bitmapData) free(bitmapData); // 9
CGImageRelease(myImage);
}
一切都编译得很好,但是当我调用该方法时什么都没有出现。
我的理解是,与drawInRect
要求 UIView 在图片中(没有双关语)不同,即使您不使用 UIKit,此位图绘制也可以从任何类型的类中进行。
在这个例子中,我只是简单地调用方法 fromviewDidLoad
作为测试,但我想我可以从任何地方调用它,甚至是 NSObject 子类,并期望看到一些东西;至少,这是 Apple 文档所建议的。有什么想法吗?
更新:在 Apple 文档中的进一步阅读使我尝试创建上下文,而不是使用之前定义的自定义函数:
// myBitmapContext = MyCreateBitmapContext (400, 300);// 3
UIGraphicsBeginImageContext(myBoundingBox.size);
myBitmapContext=UIGraphicsGetCurrentContext();
但是,结果仍然没有出现在屏幕上。此外,即使我没有直接调用,我也会在日志中得到这个malloc
:
malloc: *** error for object 0x102b1020: pointer being freed was not allocated*** set a breakpoint in malloc_error_break to debug