イテレータ
IronRubyでは、
http://d.hatena.ne.jp/arikui/20071115/1195136984
のようにして使えるやつ。なんとVB.NETではラムダ式が使えるんだって。すごいや。
' ClassLibrary1というところにある Imports System.Drawing Public Class ImageProccessing Public image As System.Drawing.Bitmap ' Bitmapは継承できないそうです Public Sub New(ByVal image As System.Drawing.Bitmap) Me.image = image.Clone() End Sub ' Eachは予約語です Public Sub eachPixel(ByVal f As Func(Of System.Drawing.Color, System.Drawing.Color)) Dim i As Integer Dim j As Integer For i = 0 To Me.image.Width - 1 For j = 0 To Me.image.Height - 1 Me.image.SetPixel(i, j, f(image.GetPixel(i, j))) Next Next End Sub End Class
eachPixelの引数が関数の定義。このようにして使う。
Dim f As Func(Of Drawing.Color, Drawing.Color) = Nothing Dim ip As ClassLibrary1.ImageProccessing f = Function(pixel) If(pixel.R > 128, Drawing.Color.FromArgb(255, 255, 0, 0), Drawing.Color.FromArgb(255, 255, 255, 255)) ip = New ClassLibrary1.ImageProccessing(PictureBox1.Image) ip.eachPixel(f) PictureBox2.Image = ip.image
素晴らしいですね。使いづらいです。VBなんてやめた。