私はであったはずの1つの引数でcalloc
のようなコードの2つのタイプミスを修正した後、sample code on Apple's Quartz programming guideをフォローしました。私@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);
}
すべてが正常にコンパイルが、私はメソッドを呼び出すときに何も表示されません。
私の理解では、UIViewが画像内にあることが必要な(意図しない)のと違って、このビットマップ描画は、UIKitを使用していなくても、どのタイプのクラスからでも行うことができます。
この例では、メソッドをviewDidLoad
から呼び出すだけですが、NSObjectサブクラスのどこからでも呼び出せると思います。少なくとも、それはアップルのドキュメントによって示唆されているものです。何かご意見は?
UPDATE:アップルのドキュメントでさらに読書は、コンテキストを作成するために、これを試すのではなく、以前に定義されたカスタム関数を使用するように私を導い:
// myBitmapContext = MyCreateBitmapContext (400, 300);// 3
UIGraphicsBeginImageContext(myBoundingBox.size);
myBitmapContext=UIGraphicsGetCurrentContext();
はしかし、結果はまだに表示されて何もありません画面。また、私は私が直接malloc
を呼び出していない午前にもかかわらず、ログにこれを取得する:あなたが画面上に描画コンテキストに画像(myImage
)を描画する必要が
malloc: *** error for object 0x102b1020: pointer being freed was not allocated*** set a breakpoint in malloc_error_break to debug
申し訳ありません。この質問はトピックから外れるかもしれませんが、どのようにしてobjective-cでこのサンプルコードを使用できましたか?メソッド形式はObjective-cにありません。私はquartzcoreを学び始めたばかりで、私の質問に答えることができれば感謝しています。ありがとう。 – cessmestreet
@ user1681701 AppleのQuartzはC APIなので、Objective-Cが完全にサポートする「フォーマット」はCです。 – johnbakers