1

私は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);


 }

すべてが正常にコンパイルされますが、メソッドを呼び出しても何も表示されません。

私の理解では、drawInRectUIViewが画像に含まれている必要がある(しゃれは意図されていない)のとは異なり、このビットマップの描画は、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
4

3 に答える 3

6

画面上に何かを描くのに何が必要かについて混乱しています。UIViewiOS アプリまたはNSViewCocoa アプリのいずれかで、何らかのビューが必要です。

通常、どちらの種類のビューでも、メソッドを実装して描画する必要があります-drawRect:。それ以外の場合は (簡単に) 引き込むことはできません。(これは実際には非常に一般化されていますが、十分に近いです。)

または、画像をファイルに保存してから、そのファイルを開きます。(たとえば、 を でラップしCGImageRefUIImageを使用UIImagePNGRepresentationして PNG データを作成し、それ-[NSData writeToFile:atomically:]をファイルに書き込みます。)

あなたのコードにもいくつかの問題があります。 -testDrawCGここまではOKです:

    myImage = CGBitmapContextCreateImage (myBitmapContext);// 5

ビットマップ コンテキストの内容 (前に描いた 2 つの四角形) を取得し、CGImageRefそれらから を作成しました。この画像は、コンテキストのスナップショットと考えてください。

    CGContextDrawImage(myBitmapContext, myBoundingBox, myImage);// 6

これで、そのイメージを同じコンテキストに戻しています。なぜあなたがこれをするのか私にはわかりません。スキップしてください。

    char *bitmapData = CGBitmapContextGetData(myBitmapContext); // 7

これで、ビットマップ コンテキストを裏付ける生データを取得できます。これを行う必要はありません。

    CGContextRelease (myBitmapContext);// 8

OK、これでコンテキストは完了です。これは理にかなっています。

    if (bitmapData) free(bitmapData); // 9

これをしないでください!Create名前にまたはを含むメソッドを使用してデータを取得しなかったため、データをCopy所有していないため、解放しないでください。

    CGImageRelease(myImage);

OK、いいよ、イメージが完成したので、リリースします。しかし、この画像に対して何の役にも立たなかったので、画像がどこにも表示されなくても驚くことではありません。

于 2012-04-08T05:08:15.837 に答える
0

myImage画面に描画するコンテキストに画像 ( ) を描画する必要があります。のサブクラスを作成し、コードをそのメソッドUIViewに入れます。次に、引き続き で、次のようにビューのコンテキストに描画します。testDrawCGdrawRect:drawRect:myImage

CGContextDrawImage(UIGraphicsGetCurrentContext(), self.bounds, myImage);
于 2012-04-08T04:58:23.303 に答える
0

いつでもビットマップに描画できますが、描画はビットマップに行われます。描いたものを見たい場合は、通常の描画サイクル中に UIView または CALayer に描画する必要があります。

描画を完全に制御するには、rob mayoff の提案に従ってください。現在描いているものだけを見たい場合は、 を に変えCGImageRefUIImage内に表示できますUIImageView:

UIImage *image = [UIImage imageWithCGImage:myImage]; [someImageView setImage:画像];

ただし、これは、画面への描画がUIImageView drawRect:メソッドで発生したことを意味します。 外部の画面に描画する Apple 承認の方法があるとは思えませんdrawRect:

于 2012-04-08T05:06:16.147 に答える