Bitmap for WPF
画像のクリッピング
機能 > 変換の適用 > 画像のクリッピング

2次元画像において、選択されたフレーム領域の境界内のピクセルの選択的レンダリングを提供するにあたっては、クリッピングが必須の要件となります。Bitmap は、クリッパー変換を使用してソース画像をクリップし、画像全体の一部を読み込むことができます。

以下の画像は、クリッピング機能を示しています。

コード内で Bitmap を使用してイメージをクリップするには、次の手順を実行します。

  1. 次の import ステートメントを追加します。
    Imports System.IO
    
    using System.IO;
    
  2. Form1 クラスにて、矩形と点をグローバル変数として初期化します。
    '変数を初期化します
    Dim start As Point
    Dim selection As Rect
    Dim dragHelper As C1DragHelper
    
    //変数を初期化します
    Point start;
    Rect selection;
    C1DragHelper dragHelper;
    
  3. MainWindow コンストラクタ内で、ドラッグジェスチャーを制御する変数を初期化し、ドラッグイベントをサブスクライブします。
    'ドラッグジェスチャーのためにドラッグヘルパーを初期化します
    dragHelper = New C1DragHelper(image)
    
    'ドラッグイベントを登録します
    dragHelper.DragDelta += dragHelper_DragDelta()
    
    //ドラッグジェスチャーのためにドラッグヘルパーを初期化します
    dragHelper = new C1DragHelper(image);     
          
    //ドラッグイベントを登録します
    dragHelper.DragDelta += dragHelper_DragDelta;
    
  4. クリッパー変換を適用するために、以下のコードを追加します。
    '変換を適用するための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)));
    }
    
  5. クリップされる画像の一部分を選択するために、以下のコードを追加します。
    '画像から画像の一部を選択するイベント
    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)));
    }
    
  6. F5 キーを押してアプリケーションを実行し、「画像の読み込み」ボタンをクリックして画像を読み込みます。
  7. 画像の一部をマウスで選択し、「画像のクリッピング」'ボタンをクリックすると、選択された部分が切り取られます。
関連トピック