問題タブ [cgbitmapcontextcreate]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
calayer - レイヤーでのアルファ検出は、iPhone ではなくシミュレーターで OK
まず、SO の他の場所からCALayerへのこの非常に便利な拡張機能を確認してください。レイヤーのコンテンツに割り当てられたCGImageRefのポイントが透明か透明でないかを判断するのに役立ちます。
注意: レイヤがCGImageRefcontents
であるかのように表現可能または応答するという保証はありません。(これは、上記で参照されている拡張機能の広範な使用に影響を与える可能性があります。) ただし、私の場合、テストしているレイヤーにはCGImageRefが割り当てられていることがわかっています。(うまくいけば、これは配属後も私の下から変わることはありません! さらに、それが保持されていることに気付きました。)contents
contents
さて、当面の問題に戻りましょう。拡張機能の使用方法は次のとおりです。まず、セレクターを からcontainsPoint:
に変更しましたcontainsNonTransparentPoint:
(元のメソッドを維持する必要があります)。
これで、 7 つのCALayerオブジェクトを使用するUIImageViewサブクラスができました。これらは、不透明度ベースのアニメーション (パルス/グロー効果およびオン/オフ状態) に使用されます。これらの 7 つのレイヤーのそれぞれに既知のCGImageRefがあり、ビュー全体の一部を独自の色帯で効果的に「カバー」(エア クォート) します。それぞれのレイヤー内の各画像の残りの部分は透明です。contents
サブクラスでは、シングル タップ ジェスチャを登録します。1 つが到着すると、レイヤーを調べて、効果的にタップされたレイヤー (つまり、タップした場所が不透明なポイントがあり、最初に見つかったレイヤーが勝つ) を確認してから、必要なことを何でも実行できます。
ジェスチャを処理する方法は次のとおりです。
良いニュース?これらはすべて、iOS 4.3.2 の iPhone シミュレーターで美しく動作します。(FWIW、私は Xcode 4.1 を実行している Lion を使用しています。)
しかし、私の iPhone 4 (iOS 4.3.3 を搭載したもの) では、それにさえ近づきません! 私のタップはどれも、私が期待するレイヤーのいずれとも一致しないようです。
1x1 ピクセル コンテキストに描画するときにCGContextSetBlendModeを使用するという提案を試みても、さいころはありません。
パイロットのエラーだといいのですが、何が違うのかはまだわかりません。タップにはパターンがありますが、識別できるものではありません。
おそらく、データ境界の問題があります。おそらく、y座標を画像の左下に反転する以外のことをしなければなりません。まだわかりません。
誰かが間違っている可能性があることに光を当てることができれば、私は最も感謝しています!
更新、2011 年 9 月 22 日:最初のあははの瞬間を獲得しました! 問題は Simulator-vs-iPhone ではありません。網膜対非網膜です!Retina 版を使用している場合、シミュレーターで同じ症状が発生します。おそらく、ソリューションは何らかの方法/形状/形式でのスケーリング (CTM?) を中心にしています。Quartz 2D Programming Guide は、「iOS アプリケーションはUIGraphicsBeginImageContextWithOptionsを使用する必要がある」ともアドバイスしています。私はここで解決策に非常に近いと感じています!
objective-c - UIImage の setNeedsDisplay が機能しない
ボタンがタッチされたときに dataBuffer を使用して UIImage に線を描画しようとしていますが、drawRect: .. メソッドが呼び出されません。(なので、描きたい線が出てこない)
どこに問題があるのか 本当にわからないので、かなり多くのコードを投稿しました。申し訳ありません。
ところで、私はビューベースのアプリケーションに取り組んでいます。
ここに私のコードがあります:
iphone - CGBitmapContextCreateImage を使用して高品質の画像を取得する方法
どのように?... CGBitmapContextCreateImage() を使用して高品質の画像を取得しようとしていますが、次のコードでそれを実行しようとしました。
しかし、ぼやけた画像を得ることができなかったので、レンダリングされた画像と元の画面画像には多少の違いがあります。理由がわかりません。私を助けてください...
ios - CGBitmapContext のバイト オーダーが ABGR に変更されました - CGImage メタデータがビットマップ コンテンツと一致していないようです
次のコードを使用して、画像の向きと最大サイズを標準化しています(他の場所から収集):
このコードは、回転が UIImageOrientationUp に変換された UIImage を正しく返し、画像が最大画像サイズを超えた場合は縮小される可能性があります。このコードは、UIView で UIImage を表示する場合にうまく機能します。
ただし、その新しい UIImage を取得し、その CGImage コンテンツをビットマップ コンテキストに抽出すると、次のステップで問題が発生します。
そして、それを UIImage に戻して、すべての色が間違っています。inImage から取得した CGImageGetAlphaInfo をチェックして、kCGImageAlphaPremultipliedFirst に設定されたコンテキストを設定しました。AlphaInfo を強制的に kCGImageAlphaPremultipliedLast にすると、少なくとも画像は表示されましたが、赤は明らかに青として表示されていました。最後に、ビットマップ内の RGBA データが ABGR に転置されていることがわかりました。ループを作成してバイト順を RGBA に転置することで、CGImage から作成されたコンテキストを使用して正しい UIImage を再作成できることがわかりました。
スケール アンド ローテーション メソッドを通過したときにのみ、この ABGR 問題が発生します。私の理解では、UIImage を CGbitmapContext に変換し、独自のメタデータをコンテキスト パラメーターとして使用して、まったく同じ画像を受け取ることができるはずです。
私の質問は: ビットマップ ピクセルのバイト順が ABGR に変更されるのはなぜですか? それ自体から作成された BitmapContext から直接 CGImage を再作成できないという CGImage メタデータがどのようにめちゃくちゃになったのですか?
前もって感謝します!
ios - GBitmapContextCreate: サポートされていないパラメーターの組み合わせ
CGBitmapContextCreate に問題があり、以下を取得しています。
エラー: サポートされていないピクセルの説明 - 1 コンポーネント、8 ビット/コンポーネント、8 ビット/ピクセル
このコードで:
ピクセルあたり 8 ビット、コンポーネントあたり 8 ビットです。なぜエラーが発生するのかわかりません。ここでこれを正しく行うことについての他のいくつかの投稿を見てきましたが、ほとんどの場合、新しい画像を作成するのではなく、画像の編集を扱っているため、元の画像から設定の一部を取得できます。
alpha - CGBitmapContextCreate with kCGImageAlphaNone
アルファチャンネルなしで CGContextRef を作成する必要があります。残念ながら、Core Graphics では、CGBitmapCreateContext で kCGImageAlphaNone を指定することはできません。
誰かがアルファチャンネルなしで CGContextRef を作成する方法の実例を投稿できますか?
これが必要な理由は、最終的に CGImageCreateWithMaskingColors を呼び出そうとしているためです。もちろん、提供された CGImageRef にアルファ チャネルがある場合は機能しません。
実際の例を投稿してください。そうすれば、最先端にいること、そしてそうする最初の人になるという事実を楽しむことができます! 投稿してください!
ios - iOS CGBitmapContextCreate はデータをコピーしますか?
私はこのコードを書きました:
これを行うと、CGBitmapContext が私の bitmapData をコピーするので、これらの行の後に書き込みを行う必要があります
iphone - 次の機能でメモリフットプリントはどこで増加しますか?
以下の機能を使用しています。その時に呼び出すと、メモリ使用量が増えます。すべてのリークをチェックしました。それでも、機能が終了したらすぐにオブジェクトを解放します。ここでは、参照用のコードを提供しています。ガイドラインを提供してください。
//関数の開始時のメモリ使用中のメモリ(バイト単位):38936576
//関数終了時のメモリ(プールドレイン後)使用中のメモリ(バイト単位):39272448
//働き
ありがとう。
iphone - Core Graphics で、アルファ チャネルが最も重要であることが好まれるのはなぜですか? (kCGImageAlphaPremultipliedFirst vs kCGImageAlphaPremultipliedLast)
ビットマップ コンテキストを作成するほとんどのコードは、 RGBA を作成するkCGImageAlphaPremultipliedFirst
代わりに を使用して ARGB を作成します。kCGImageAlphaPremultipliedLast
ARGB が好まれる理由はありますか?
(使用法):
ios - Retina ディスプレイで機能し、通常のディスプレイにスペースを無駄にしない CGBitmapContext を作成するにはどうすればよいですか?
も含めてUIKitにあればdrawRect
、RetinaディスプレイのHD面を自動で扱うというのは本当ですか?ではdrawRect
、1024 x 768 ビューの現在のグラフィックス コンテキストは、実際には 2048 x 1536 ピクセルのビットマップ コンテキストであるということですか?
(更新:現在のコンテキストを使用して画像を作成し、drawRect
そのサイズを印刷すると:
新しい iPad では、ステータス バーを無効にすると、2048 と 1536 が出力され、iPad 2 では 1024 と 768 が表示されます)
1ポイント=4ピクセルを自動で処理してくれる贅沢を、私たちは実際に楽しんでいます。
ただし、を使用するCGBitmapContextCreate
と、それらは実際にはポイントではなくピクセルになりますか? (少なくともそのビットマップにデータバッファを提供する場合、バッファのサイズ(バイト数)は明らかに高解像度用ではなく、標準解像度用です。バッファとして渡しNULL
たとしても、それがCGBitmapContextCreate
バッファを処理します、サイズはおそらくデータ バッファーを渡す場合と同じであり、Retina の解像度ではなく、単なる標準解像度です)。
2048 x 1536 は、iPad 1 と iPad 2、および新しい iPad でいつでも作成できますが、新しい iPad にのみ必要なため、メモリとプロセッサと GPU の電力が浪費されます。
では、そのようなビットマップ コンテキストを作成するために a を使用する必要がif () { } else { }
ありますか?また、実際にどのように作成するのでしょうか? そして、CGContextMoveToPoint
Retina ディスプレイを使用するには、すべてのコードを調整する必要があります。これは、コードにとって非常に厄介な場合があります。(または、ローカル変数を定義して、標準解像度の場合は 1 に設定し、網膜の場合は 2 に設定することもできます。そのため、andは、を使用して描画するときだけではなく、常に になります。)x * 2
y * 2
x, y
scaleFactor
[[UIScreen mainScreen] scale]
x
y
x * scaleFactor
y * scaleFactor
x
y
CGContextMoveToPoint
0.0 のスケールが渡された場合、Retina 用に自動的に作成できるようですUIGraphicsBeginImageContextWithOptions
が、コンテキストを作成して保持する必要がある場合 (および UIViewController の ivar またはプロパティを使用して保持する必要がある場合) は使用できないと思います。 . を使用してリリースしないとUIGraphicsEndImageContext
、グラフィックス コンテキスト スタックに残るので、CGBitmapContextCreate
代わりに使用する必要があるようです。(それとも、スタックの一番下にとどめて、気にしないようにしますか?)