-1

ソース画像

上記の画像から、赤い長方形の後ろの部分が必要な場合は簡単に取得できますが、黄色の長方形の後ろの部分が回転しているため取得できないという問題があります。

では、回転した形状から画像の一部を取得するにはどうすればよいでしょうか?

たとえば、私の目標は、長方形が画像上にある画像の一部を取得することです。誰かがこの長方形を x 度 [どの方向でも] 回転させると、回転を適用した後に画像の正確な部分を抽出することが難しくなります。

助言がありますか?

4

2 に答える 2

0

Mihir さん、この課題の回転/AffineTransform の側面に気を取られて、間違った道に進んでいると思います。また、ここでの「取得」の意味がよくわからないことにも注意してください。強調表示された領域を画像に保存しますか? 別の画像の透かしとしてレンダリングしますか? など...私はあなたを正しい道に導くために、一般的なケースで答えようとします.

必要なのは、上の画像の黄色の多角形で定義された画像のコンテンツです回転した長方形のように見えるという事実を無視します。

遅れており、ここでステップが欠落していますが、これで 90% の方法が得られ、必要な最後の部分 (Graphics2D.setClip) が明確になると思います。

  • 必要な領域の周囲の領域を定義するjava.awt.Polygonを作成します。
  • getBounds() または getBounds2D() を使用して、長方形にレンダリングされたときにこの Polygon を保持するために必要なバウンディング ボックスの幅/高さを取得します。(例: バウンディング ボックス)
  • これらの幅/高さの値で新しい BufferedImage を作成します。
  • 新しい BufferedImage から Graphics2D を取得します (例: newG2)
  • newG2.drawImage(originalImage、boundingBox.x、boundingBox.y、boundingBox.width、boundingBox.height)

: ここで私の記憶が失われます。ある時点で newG2 ( newG2.setClip(someShape) )にクリップを設定する必要があるため、バウンディング ボックスがレンダリングされたときに、レンダリングされたグラフィックスの完全なバウンディング ボックスを取得するのではなく、によって定義された一部のサブセットを取得します。黄色い輪郭。

これを行う簡単な方法の 1 つは、2 つのポリゴンを作成することです。

  1. poly1 = 元のイメージで黄色の選択範囲を定義する java.awt.Polygon。
  2. poly2 = Polygon とまったく同じ形状を定義する java.awt.Polygon ですが、原点が 0,0 にシフトされています。

poly1 は、バウンディング ボックスを取得して、黄色で選択されたコンテンツ (およびその周囲の余分なコンテンツ) を囲む完全なバウンディング ボックスをコピーするために使用されます。

poly2 は、ターゲット Graphics2D (newG2) にクリップを設定するために使用されるため、バウンディング ボックスがそこにレンダリングされるときに、黄色の形状の外側にあるすべてのものを切り取って、黄色のコンテンツだけを取得します。ARGB イメージ タイプを使用し、ターゲット イメージの背景を透明に設定することをお勧めします。そうしないと、塗りつぶしの色が黒になります。

これはクリップの正しい方向だと思います。私は何年にもわたって Java2D に目を光らせていましたが、しばらくの間 Java2D から離れていました。微調整する必要があるかもしれませんが、必要なツールはこれだけです。

于 2013-08-26T04:19:14.813 に答える
0

ここでは、可能なアプローチのより長い説明があります。私は Java2D 描画 API についてよく知りませんが、正しく覚えていれば、必要なことを実行する機能を備えています。

最初に、画像の左上隅にまっすぐに配置された同じサイズの長方形と比較して、必要なサブ領域の移動と回転を把握する必要があります。次に、この変換を反転します。

メモリ内のビットマップに基づくグラフィックス コンテキストを作成します。これは、必要なサブイメージのサイズを持つ必要があります。コンテキストで前に計算した逆変換を設定し、位置 0,0 に画像を描画します。Java2D は変換を考慮に入れるため、必要なサブイメージをメモリ ビットマップに取得する必要があります。

于 2013-08-07T05:49:34.877 に答える