これは言葉で説明するのは本当に難しい質問です(とにかく私にとってはそうです)。画像(ビットマップ)を取得して、画面の中央で特定のサイズに画像をトリミングできるようにする必要がありますが、画像のサイズは同じままです。うまくいけば、下の写真は私が何を意味するのかを説明することができます:
したがって、画像は全体として中央の正方形にトリミングされますが、画面全体に引き伸ばされることはなく、中央に残ります。したがって、基本的に画像の無意味な部分を削除しますが、ピクセルの座標は同じに保ちます。
これは言葉で説明するのは本当に難しい質問です(とにかく私にとってはそうです)。画像(ビットマップ)を取得して、画面の中央で特定のサイズに画像をトリミングできるようにする必要がありますが、画像のサイズは同じままです。うまくいけば、下の写真は私が何を意味するのかを説明することができます:
したがって、画像は全体として中央の正方形にトリミングされますが、画面全体に引き伸ばされることはなく、中央に残ります。したがって、基本的に画像の無意味な部分を削除しますが、ピクセルの座標は同じに保ちます。
それで、あなたがあなたの顔検出をして、あなたの画像で1つの顔を見つけたとしましょう。画像は320x240で、顔は位置100,40、幅20 x 30の長方形で囲まれています。では、その情報をどのように処理しますか?私は最善を尽くして支援しますが、おそらく私の側の悪い仮定をクリアする必要があります。
まず、顔をつかんで、 Bitmap.createBitmap()のような新しいビットマップに保存できます。
Bitmap face = Bitmap.createBitmap(largeSource, 100, 40, 20, 30);
これは、onCreateやその他の初期化ステップのように、描画ループの外側で実行する必要があります。
大きな画像を格納するコンテナ(ImageView?onDrawがオーバーライドされたカスタムビュー?)があるようです。そして今、あなたはそのコンテナの元の位置に顔を描きたいだけですか?カスタムビューがある場合、それはonDrawで次のように簡単です。
canvas.drawBitmap(face, 100, 40, facePaint);
代わりにImageViewを使用している場合は、きめ細かい描画コントロールが必要なように思われるため、代わりにカスタム描画ビューを使用することをお勧めします。
最後に、これらの面が多数ある場合は、ビットマップ、x、およびy座標のみを持つ新しいFaceObjPOJOオブジェクトを作成します。顔を検出したら、それらをArrayListに追加し、onDrawでこれを繰り返して、すべての顔を描画します。
faces.add(new FaceObj(Bitmap.createBitmap(largeSource, 100, 40, 20, 30), 100, 40);
...
foreach(FaceObj f : faces)
canvas.drawBitmap(f.bitmap, f.x, f.y, facePaint);
画像を切り抜くのではなく、正方形の周りのピクセルを「非表示」にする必要があることを理解している場合。
あなたがやろうとしていることに応じて、これを行う多くの方法があります。たとえば、画像の興味のない部分を黒で塗りつぶしたり、透明にしたりできます。
このようにして、「トリミングされた」画像の座標は画面上で同じままになります。
関心があるのが画像の中心だけである場合、これを行う非常に簡単な方法の1つは、android:scaleType = "center"属性をImageViewに追加し、ImageViewを目的の切り抜きサイズに設定することです。ただし、配置可能にしたい場合は、別の話になります。
を使用Canvas.drawBitmap()
すると、画像の一部を別のビットマップにコピーし、他の部分を破棄できる場合があります。この特定のバージョンのメソッドを使用すると、で取得した色の配列を送信しgetPixels()
、オフセット、およびコピーする幅と高さを設定できます。ただし、このstride
パラメータは重要です。元の画像からピクセルを取得するため、最終的な画像が小さくなっても、元の画像の幅に設定する必要があるためです。