2009-05-14 4 views
1

これを想像してください:私はテディベアまたは三角形を示すPNG画像を持っています。何か非二次的なもの。今、私は、特定の行と方向(UIImageViewの座標系に関連する座標)のどの点で、実際の可視画像が始まるかを知りたいと思います。透明度を持つPNG内の境界線の座標を自動的に見つける方法はありますか?

例:最後の行を見ると、テディベアの足がどこから始まるかを知る必要があります。足が二次的でないので、それは単なるframe.origin.xではありません。 x = 12のどこかで始まることがあります。

イメージデータを何とか反復して、ピクセルを検査します。「ねえ、あなたは透明ですか?」それがそうであれば、私は次のものに行きます。 "ねえ、あなたと何が違うの?透明?"私が結果を得るまで、「いいえ、私は完全に不透明です!」それから、私は知っている: "そう、足はPNGで始まる!境界だ!"

次に、私はすべての行についてこれを行い、何らかのパス座標を取得します。 個人的には、私は床で現実的に動揺させたいので、回転修復の完璧な点を検出するためにこれが必要です。私はフレーム幅と原点情報を使うだけではありません。現実的ではないでしょう。

So:ピクセルが透明であるかどうかを確認するために、UIImageまたはイメージのデータをイントロスペクションする方法はありますか?

+0

深い衝突の検出に役立つのと同じことを探しています –

+0

深い衝突の検出には重要です。私はゲーム開発者がこれを正確に行うことを知っています。 – Thanks

答えて

1

既知の形式のメモリ内コンテキストを作成し、メモリコンテキスト。宛先コンテキストは、読みやすいように設計された元の画像とは異なるビットマップ形式とカラーモ​​ードにすることができます。

あなたは罰のために大食家なら別の方法として、あなたがして、ピクセル形式のデータをデコードするコードを書く、ピクセルフォーマットを決定するためにCoreGraphicsの機能を使用し、UIImageのCGImageプロパティを取得することができます...

使用しているイメージを制御する場合、最後のオプション:イメージからマスクイメージ(1ビットアルファ)を​​作成し、エッジをどこに配置するかを決定するために使用します。このようなマスクは、グラフィックスエディタで簡単に作成できます。また、描画プロパティを正しく設定すると、イメージを1ビットのメモリ内のコンテキストに描画することもできます。

+0

既知の形式のメモリ内コンテキストを作成するにはどうすればよいですか? – Thanks

+0

実際、アンディの答えはかなり良い例へのリンクを持っています。 –

2

UIImageを使用してこれを行うのはかなり簡単な方法ではないようです。代わりに、2つの簡単なオプションがあります。

理想的には、使用する画像を制御する場合、必要なデータを事前に計算することができます。次に、あなたが興味のあるポイントが画像の中央にあるように画像を再フォーマットするか(幅と高さだけで簡単にクライアント側で計算することができます)、画像を使って座標を送信します。これにより、各画像の再計算が不要になり、アプリケーションを高速化し、バッテリ寿命を延ばすことができます。

libpngのようなイメージライブラリは、プログラムに静的にコンパイルできます。イメージをロードし、処理してからアンロードし、ファイルをUIImageに渡すことができます。使用する関数のみがリンクされるため、レンダリングルーチンが省略される可能性があるため、余分な膨らみを避けることができます。これには、ソフトウェアをサードパーティのライブラリに依存させるという欠点があります。

3

ネット上で、画面上の各ピクセルのUIColor(ARGB)値を取得できるthis tutorialが見つかりました。もしあなたが少しtweekすればUIImageを渡して必要な値をすべて得ることができます

+0

それは動作しますが、イメージのコピーを作成してそこから単一のピクセルを抽出します。明らかに、元のポスターのアプリケーション用にキャッシュします。 –

+0

コピーは、ある種の「正規化された」グラフィックスコンテキストを取得するために行われます。 CGはイメージから指定されたコンテキストにコンテキストを変換する処理を行います。だから、ピクセルを反復処理することができます。まあ、理論的には。プラクシスではアルファには効果がありませんでした。結果は非常に危険です。 – Thanks

関連する問題