2011-06-19 3 views
2

アルファマスク画像をコード内に描画したい。今すぐやります:アルファマスク画像のビットマップコンテキストを作成する方法は?

1)CGBitmapContextCreateとオプションCGColorSpaceCreateDeviceRGBkCGImageAlphaPremultipliedFirstを使用してビットマップコンテキストを作成します。

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()がありますが、コンポーネントの数だけが報告されます。これは、コンポーネントが持つバイト数を教えてくれません。

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

あなたは素晴らしい答えで私の一日を作ります。ありがとう。


編集: Iは、コードスニペットを発見し、それが混乱して:行あたりのバイトのため

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

なぜ0?ドキュメントには、0を渡すことができるとは示されていません。

+0

また、mallocの代わりにcallocを使用してイメージを作成する前にそのイメージをゼロにする必要があります。そうでなければ、ランダムなピクセルを持ちます(色で塗りつぶす場合は重要ではありません)。 – Chris

答えて

1

これらのパラメータは、データまたはメモリをどのように扱うかをシステムに指示しています。あなたはそれを自分で作成しているので、あなたはどのレイアウトを意図しているのか知っています。何があったとしても、システムがその背後で何をしたいのかは、あなたの直ちに問題ではありません。

この場合、1つのコンポーネントだけで8ビットを提供し、おそらく行パディングを使用したくない場合は、bytesPerRowが実際に画像の幅と同じになるはずです。

+0

行パディングは何に適していますか? – openfrog

+0

また、 'CGBitmapContextCreate'の' bitmapBytesPerRow'に0を与える人がいるのはなぜですか? – openfrog

+0

@openfrog行パディングを使用すると、データがメモリアクセスに最適な方法で整列するようにすることができます(たとえば、行がマシンワードの途中で開始されないなど)。あなたはこのような状況でそれを必要とすべきではありません。しかし、それは明示的にいくつかのファイル形式で必要とされるので、イメージコンテクストがその種類のデータを読み込むときに理解すれば、それはより簡単になります。 – walkytalky

関連する問題