f8g

イテレータ

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なんてやめた。