私は単色の画像を持っており、それからいくつかの部分のサイズを異なるスケールで変更する必要があります。望ましい結果は画像に示されています。Opengles でグリッド メッシュを適用する方法を調べましたが、サンプル コードや詳細なチュートリアルが見つかりませんでした。imgwrapも調べましたが、このライブラリには qt フレームワークが必要であることがわかります。さらに読むためのアイデア、サンプルコード、またはリンクをいただければ幸いです。
6 に答える
あなたが直面している問題は、コンピュータ グラフィックスで「画像のゆがみ」と呼ばれます。最初に、元の画像にいくつかの制御点を定義し、サンプルの目的の画像に対応する点を定義する必要があります。次に、高密度の変位フィールド (このアプリケーションではラッピング グリッドとも呼ばれます) を計算し、このフィールドを元の画像に簡単に適用する必要があります。
より実際的には、iOS での最善の策は、OpenGL で頂点の 2D グリッドを作成することです。元の画像をこのグリッド上にテクスチャとしてマップし、ポイントの一部を移動して元のグリッドを変形します。次に、glReadPixels を使用して、結果の画像のスクリーンショットを撮るだけです。
この種の変位フィールド マッピングを実装する CIFilter は知りません。
更新: 8 つの制御点を使用して OpenCV で画像をモーフィングするサンプル コードも見つけました。http://engineeering.blogspot.it/2008/07/image-morphing-with-opencv.html
OpenCV には iOS への移植が機能しているため、上記のリンクのコードをターゲット デバイスでも簡単に試すことができます。
いくつかのアイデア:
- CGBitmapContextCreateImage() を使用して UIImage の一部を別の CGContext にコピーし、その部分をコピーして個別にスケーリングし、元に戻します。
- イメージの一部に CIFilter 効果を使用し、スケーリングする部分をマスキングします。(コア イメージ プログラミング ガイド)
GitHub でBrad Larson のGPUImageプロジェクトをチェックすることをお勧めします。[視覚効果] の下GPUImageBulgeDistortionFilter
には、ニーズに合わせて調整できるなどのフィルターがあります。
おそらく、OpenGL シェーダーを見たいと思うでしょう。私がしたいことは、画像をテクスチャとしてロードし、フラグメント シェーダ (画像を歪ませる小さなプログラム) を適用し、結果をテクスチャにレンダリングして、そのテクスチャを表示することです。またはビットマップとして保存します。
単純ではありませんが、他の歪みのサンプル コードがいくつかあります。ここにシェーダーの渦があります: http://www.geeks3d.com/20110428/shader-library-swirl-post-processing-filter-in-glsl/
OpenGL を使用せずにこれを行う簡単な方法はないと思います。GPU の外部でこれを行っても、おそらく優れたパフォーマンスは見られないでしょう。