アルファマスク画像をコード内に描画したい。今すぐやります:アルファマスク画像のビットマップコンテキストを作成する方法は?
1)CGBitmapContextCreate
とオプションCGColorSpaceCreateDeviceRGB
とkCGImageAlphaPremultipliedFirst
を使用してビットマップコンテキストを作成します。
2)次に、白と黒のようなグレースケールの色のみを使用して、このコンテキストに描画します。
3)次に、CGImageMaskCreate
を使用して、そのコンテキストからマスク画像を作成します。
結論:私は多くのメモリを無駄にします!私の理解から、マスク画像はグレースケールのみなので、そうですか?それでは、なぜARGBに最初にコンテキストを作成するのですか?
マスクイメージの描画に使用するCGContextRefを作成するにはどうすればよいですか?私の考えはCGColorSpaceCreateDeviceGray
ですが、ここで問題が始まります。
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
を計算する方法がわからない:これは私が私のARGBのビットマップコンテキストを作成する方法正確なコードです。私はそれがちょうどimageWidth
だろうと仮定しますか? bits per component
には、CGBitmapContextCreate
に何を入力する必要がありますか?
CGColorSpaceGetNumberOfComponents()
がありますが、コンポーネントの数だけが報告されます。これは、コンポーネントが持つバイト数を教えてくれません。
また、4
と8
は上記のコードでハードコードされています。コンポーネントごとに常に4バイトと言われていますが、コンポーネントごとに8ビットと言われる人は誰ですか?私はちょうどそこにさまざまなサンプルコードからこれを取った。誰もがこのようにしているようだ。できます。しかし、将来の証拠?おそらくそうではありません。
あなたは素晴らしい答えで私の一日を作ります。ありがとう。
編集: Iは、コードスニペットを発見し、それが混乱して:行あたりのバイトのため
CGColorSpaceRef colorSpace2 = CGColorSpaceCreateDeviceGray();
CGContextRef gradientBitmapContext = CGBitmapContextCreate (NULL, 1, reflectRect.size.height,8, 0, colorSpace2, kCGImageAlphaNone);
なぜ0?ドキュメントには、0を渡すことができるとは示されていません。
また、mallocの代わりにcallocを使用してイメージを作成する前にそのイメージをゼロにする必要があります。そうでなければ、ランダムなピクセルを持ちます(色で塗りつぶす場合は重要ではありません)。 – Chris