2次元画像において、選択されたフレーム領域の境界内のピクセルの選択的レンダリングを提供するにあたっては、クリッピングが必須の要件となります。Bitmap は、クリッパー変換を使用してソース画像をクリップし、画像全体の一部を読み込むことができます。
以下の画像は、クリッピング機能を示しています。
コード内で Bitmap を使用してイメージをクリップするには、次の手順を実行します。
'変数を初期化します Dim start As Point Dim selection As Rect Dim dragHelper As C1DragHelper
//変数を初期化します
Point start;
Rect selection;
C1DragHelper dragHelper;
'ドラッグジェスチャーのためにドラッグヘルパーを初期化します dragHelper = New C1DragHelper(image) 'ドラッグイベントを登録します dragHelper.DragDelta += dragHelper_DragDelta()
//ドラッグジェスチャーのためにドラッグヘルパーを初期化します dragHelper = new C1DragHelper(image); //ドラッグイベントを登録します dragHelper.DragDelta += dragHelper_DragDelta;
'変換を適用するためのTransformメソッド Private Sub ApplyTransform(t As BaseTransform) Dim newBitmap = bitmap.Transform(t) bitmap.Dispose() bitmap = newBitmap UpdateImage() End Sub 'ボタンクリック時にクリッパー変換を適用するイベント Private Sub Button_Click(sender As Object, e As RoutedEventArgs) Dim cropRect = DirectCast(selection, RectD).Round() ApplyTransform(New Clipper(New ImageRect(cropRect))) End Sub
//変換を適用するメソッド void ApplyTransform(BaseTransform t) { var newBitmap = bitmap.Transform(t); bitmap.Dispose(); bitmap = newBitmap; UpdateImage(); } //ボタンクリック時にクリッパー変換を適用するイベント private void Button_Click_1(object sender, RoutedEventArgs e) { var cropRect = ((RectD)selection).Round(); ApplyTransform(new Clipper(new ImageRect(cropRect))); }
'画像から画像の一部を選択するイベント Private Sub dragHelper_DragDelta(sender As Object, e As C1DragDeltaEventArgs) Dim pos = e.GetPosition(image) pos = New Point(Math.Max(0, Math.Min(pos.X, bitmap.PixelWidth)), Math.Max(0, Math.Min(pos.Y, bitmap.PixelHeight))) selection = New Rect(Math.Round(Math.Min(start.X, pos.X)), Math.Round(Math.Min(start.Y, pos.Y)), Math.Round(Math.Abs(start.X - pos.X)), Math.Round(Math.Abs(start.Y - pos.Y))) End Sub Private Sub image_MouseLeftButtonDown(sender As Object, e As MouseButtonEventArgs) _ Handles image.MouseLeftButtonDown MyBase.OnMouseLeftButtonDown(e) Dim pos = e.GetPosition(image) start = New Point(Math.Max(0, Math.Min(pos.X, bitmap.PixelWidth)), Math.Max(0, Math.Min(pos.Y, bitmap.PixelHeight))) End Sub Private Sub image_MouseLeftButtonUp(sender As Object, e As MouseButtonEventArgs) _ Handles image.MouseLeftButtonUp MyBase.OnMouseLeftButtonUp(e) Dim pt = e.GetPosition(image) If Math.Abs(pt.X - start.X) < 4 AndAlso Math.Abs(pt.Y - start.Y) < 4 Then selection = New Rect(0, 0, bitmap.PixelWidth, bitmap.PixelHeight) End If End Sub
//画像から画像の一部を選択するイベント private void image_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) { base.OnMouseLeftButtonDown(e); var pos = e.GetPosition(image); start = new Point( Math.Max(0, Math.Min(pos.X, bitmap.PixelWidth)), Math.Max(0, Math.Min(pos.Y, bitmap.PixelHeight))); } private void image_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e) { base.OnMouseLeftButtonUp(e); var pt = e.GetPosition(image); if (Math.Abs(pt.X - start.X) < 4 && Math.Abs(pt.Y - start.Y) < 4) { selection = new Rect(0, 0, bitmap.PixelWidth, bitmap.PixelHeight); } } void dragHelper_DragDelta(object sender, C1DragDeltaEventArgs e) { var pos = e.GetPosition(image); pos = new Point(Math.Max(0, Math.Min(pos.X, bitmap.PixelWidth)), Math.Max(0, Math.Min(pos.Y, bitmap.PixelHeight))); selection = new Rect( Math.Round(Math.Min(start.X, pos.X)), Math.Round(Math.Min(start.Y, pos.Y)), Math.Round(Math.Abs(start.X - pos.X)), Math.Round(Math.Abs(start.Y - pos.Y))); }