2

コードでアルファマスク画像を描きたい。今私はします:

CGBitmapContextCreate1)オプションCGColorSpaceCreateDeviceRGBとを使用してビットマップコンテキストを作成しますkCGImageAlphaPremultipliedFirst

2)次に、白や黒などのグレースケールカラーのみを使用して、このコンテキストに描画します。

3)次に、を使用して、そのコンテキストからマスク画像を作成しますCGImageMaskCreate

結論:私はたくさんのメモリを浪費します!私の理解では、マスク画像はグレースケールのみですよね?では、そもそもなぜARGBでコンテキストを作成するのでしょうか。

マスク画像の描画に使用することを目的としたCGContextRefを作成するにはどうすればよいですか?私の考えは使用することCGColorSpaceCreateDeviceGrayですが、ここから問題が始まります。これは、ARGBビットマップコンテキストを作成する方法とまったく同じコードです。

CGContextRef    context = NULL;
CGColorSpaceRef colorSpace;
uint32_t *      bitmapData;

int imageWidth = round(size.width);
int imageHeight = round(size.height);

int bitmapBytesPerRow = (imageWidth * 4);
int bitmapByteCount = (bitmapBytesPerRow * imageHeight);

colorSpace = CGColorSpaceCreateDeviceRGB();

bitmapData = malloc(bitmapByteCount);

context = CGBitmapContextCreate(bitmapData,
                                imageWidth,
                                imageHeight,
                                8,  // bits per component
                                bitmapBytesPerRow,
                                colorSpace,
                                kCGImageAlphaPremultipliedFirst);

CGColorSpaceRelease(colorSpace);

bitmapBytesPerRowそのようなコンテキストのを計算する方法がわかりません。私はそれがちょうどだろうとimageWidth思いますか?そして、私は何を供給しなければなりませんbits per componentCGBitmapContextCreate

ありますがCGColorSpaceGetNumberOfComponents()、コンポーネントの数のみを報告します。これは、コンポーネントのバイト数を教えてくれません。

また、私を緊張させているのは、48が上記の私のコードにハードコーディングされていることです。コンポーネントごとに常に4バイトだと誰が言い、コンポーネントごとに8ビットだと誰が言いますか?さまざまなサンプルコードからこれを取り出しました。誰もがこのようにやっているようです。できます。しかし、将来の保証はありますか?おそらくそうではありません。

あなたはいくつかの素晴らしい答えで私の一日を作るでしょう。ありがとう。


編集:コードスニペットを見つけましたが、混乱しています:

CGColorSpaceRef colorSpace2 = CGColorSpaceCreateDeviceGray();
CGContextRef gradientBitmapContext = CGBitmapContextCreate (NULL, 1, reflectRect.size.height,8, 0, colorSpace2, kCGImageAlphaNone);

行あたりのバイト数が0なのはなぜですか?ドキュメントには、0を渡すことができるとは書かれていません。間違っているようです。

4

1 に答える 1

1

これらのパラメータは、提供するデータまたはメモリの処理方法をシステムに指示しています。あなたはそれを自分で作成したので、あなたはあなたが意図しているレイアウトを知っています。どちらかといえば、システムが舞台裏でそれを処理したいと思うかもしれないことは、あなたの当面の問題ではありません。

この場合、サンプルごとに8ビットを提供し、コンポーネントは1つだけで、行のパディングは使用しない可能性があります。この場合、bytesPerRow実際には画像の幅と同じである必要があります。

于 2011-06-19T17:06:41.450 に答える