コードでアルファマスク画像を描きたい。今私はします:
CGBitmapContextCreate
1)オプション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 component
かCGBitmapContextCreate
?
ありますがCGColorSpaceGetNumberOfComponents()
、コンポーネントの数のみを報告します。これは、コンポーネントのバイト数を教えてくれません。
また、私を緊張させているのは、4
と8
が上記の私のコードにハードコーディングされていることです。コンポーネントごとに常に4バイトだと誰が言い、コンポーネントごとに8ビットだと誰が言いますか?さまざまなサンプルコードからこれを取り出しました。誰もがこのようにやっているようです。できます。しかし、将来の保証はありますか?おそらくそうではありません。
あなたはいくつかの素晴らしい答えで私の一日を作るでしょう。ありがとう。
編集:コードスニペットを見つけましたが、混乱しています:
CGColorSpaceRef colorSpace2 = CGColorSpaceCreateDeviceGray();
CGContextRef gradientBitmapContext = CGBitmapContextCreate (NULL, 1, reflectRect.size.height,8, 0, colorSpace2, kCGImageAlphaNone);
行あたりのバイト数が0なのはなぜですか?ドキュメントには、0を渡すことができるとは書かれていません。間違っているようです。