21

PictureBoxWindowsフォームコントロール内に画像を表示するアプリケーションがあります。SizeModeコントロールのは、のサイズに関係なく、Zoomに含まれる画像がPictureBoxアスペクトが正しい方法で表示されるように設定されていPictureBoxます。

これは、ウィンドウのサイズを自由に設定でき、画像は常に最適なサイズで表示されるため、アプリケーションの視覚的な外観に最適です。残念ながら、画像ボックスでのマウスクリックイベントも処理する必要があり、画面空間の座標から画像空間の座標に変換できる必要があります。

画面スペースからコントロールスペースに変換するのは簡単なようですが、コントロールスペースからイメージスペース(つまり、画像ボックスで拡大縮小されたソースイメージのピクセル座標)に変換する明確な方法がわかりません。

これを行う簡単な方法はありますか、それとも、画像を配置して自分で翻訳を行うために内部で使用しているスケーリング計算を複製する必要がありますか?

4

2 に答える 2

6

翻訳を手動で実装するだけで終わりました。コードはそれほど悪くはありませんが、彼らが直接サポートを提供してくれることを望んでいました。このような方法は、さまざまな状況で役立つことがわかりました。

それが彼らが拡張メソッドを追加した理由だと思います:)

擬似コードの場合:

// Recompute the image scaling the zoom mode uses to fit the image on screen
imageScale ::= min(pictureBox.width / image.width, pictureBox.height / image.height)

scaledWidth  ::= image.width * imageScale
scaledHeight ::= image.height * imageScale

// Compute the offset of the image to center it in the picture box
imageX ::= (pictureBox.width - scaledWidth) / 2
imageY ::= (pictureBox.height - scaledHeight) / 2

// Test the coordinate in the picture box against the image bounds
if pos.x < imageX or imageX + scaledWidth < pos.x then return null
if pos.y < imageY or imageY + scaledHeight < pos.y then return null

// Compute the normalized (0..1) coordinates in image space
u ::= (pos.x - imageX) / imageScale
v ::= (pos.y - imageY) / imageScale
return (u, v)

画像内のピクセル位置を取得するには、実際の画像のピクセル寸法を掛けるだけですが、正規化された座標を使用すると、ケースバイケースであいまいさを解決するという元のレスポンダーのポイントに対処できます。

于 2008-08-06T04:25:02.490 に答える
2

スケーリングに応じて、相対的な画像ピクセルはピクセル数のどこにあってもかまいません。たとえば、画像が大幅に縮小された場合、ピクセル2、10は2、10を20、100まで表すことができるため、自分で計算を行い、不正確な点について全責任を負う必要があります。:-)

于 2008-08-05T20:33:01.693 に答える