私はAppleのQuartzプログラミングガイド(リスト2-5)のサンプルコードに従い、 (コード内のいくつかのタイプミスを、calloc
引数が1つだけあるように修正した後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を使用していない場合でも、任意のタイプのクラスから実行できます。
この例ではviewDidLoad
、テストとしてからメソッドを呼び出すだけですが、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