Getting a Good Grasp of F# (仮)

関数型言語F#をもっと楽しみたい

F#からWPFのGUIを扱う その4

前回(F#からWPFのGUIを扱う その3)の別解として、今度は Win32 API を直接利用せずにインターフェイス IValueConverter の実装を別の方法で試みます。

MyBitmapConverter クラスを再実装します。よって、前回のF#のコードの34~52行目を以下のコードで置き換えます。

  1. [<System.Windows.Data.ValueConversion(typeof<System.Drawing.Bitmap>, typeof<System.Windows.Media.ImageSource>)>]
  2. type MyBitmapConverter() =
  3.     interface System.Windows.Data.IValueConverter with
  4.         override x.Convert(value: obj, targetType: System.Type, parameter: obj, culture: System.Globalization.CultureInfo) =
  5.             let drawingBmp = value :?> System.Drawing.Bitmap
  6.             assert(not <| obj.ReferenceEquals(drawingBmp, null))
  7.  
  8.             // ビットマップからピクセルデータ取り出し    
  9.             let  bmpData: System.Drawing.Imaging.BitmapData =
  10.                     drawingBmp.LockBits(
  11.                         System.Drawing.Rectangle(System.Drawing.Point(0, 0), drawingBmp.Size),
  12.                         System.Drawing.Imaging.ImageLockMode.ReadOnly,
  13.                         drawingBmp.PixelFormat)
  14.  
  15.             let scanLineWidth = abs(bmpData.Stride) // Strideプロパティが負の場合にも対処
  16.             let buffSize = scanLineWidth * drawingBmp.Height
  17.             use graphics = System.Drawing.Graphics.FromImage(drawingBmp)
  18.             // BGRの順にデータが並んでいるので注意
  19.             let bmpSrc = System.Windows.Media.Imaging.BitmapSource.Create(
  20.                                             drawingBmp.Width,
  21.                                             drawingBmp.Height,
  22.                                             double graphics.DpiX,
  23.                                             double graphics.DpiY,
  24.                                             System.Windows.Media.PixelFormats.Bgr24,
  25.                                             null,
  26.                                             bmpData.Scan0,
  27.                                             buffSize,
  28.                                             scanLineWidth)
  29.             bmpSrc.Freeze()
  30.             drawingBmp.UnlockBits(bmpData)
  31.             bmpSrc :> obj
  32.  
  33.         override x.ConvertBack(value: obj, targetType: System.Type, parameter: obj, culture: System.Globalization.CultureInfo) =
  34.             failwith("not implemented")

内部実装は変えましたが 実行結果は前回と同じ外観です。