Indexing.vb
'' 
'' このコードは、DioDocs for Imaging のサンプルの一部として提供されています。
'' © MESCIUS inc. All rights reserved.
'' 
Imports System.IO
Imports System.Drawing
Imports System.Numerics
Imports GrapeCity.Documents.Drawing
Imports GrapeCity.Documents.Text
Imports GrapeCity.Documents.Imaging
Imports GCTEXT = GrapeCity.Documents.Text
Imports GCDRAW = GrapeCity.Documents.Drawing

'' このサンプルは、フルカラーRGBを4BPP(ビット/ピクセル)および
'' 8BPPのインデックス付き画像に変換する方法を示します。
Public Class Indexing
    Function GenerateImage(
        ByVal pixelSize As Size,
        ByVal dpi As Single,
        ByVal opaque As Boolean,
        Optional ByVal sampleParams As String() = Nothing) As GcBitmap

        Dim bmp = New GcBitmap(pixelSize.Width, pixelSize.Height, opaque, dpi, dpi)
        Using origBmp = New GcBitmap()
            '' サンプル画像を読み込みます。
            Dim imagePath = Path.Combine("Resources", "Images", "maple.jpg")
            Using stm = New FileStream(imagePath, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, FileOptions.RandomAccess)
                origBmp.Load(stm)
            End Using

            origBmp.SetAlphaTo255()
            origBmp.Opaque = opaque

            '' 4つのサンプルを結果のビットマップ上に配置できるように、
            '' 元の画像をリサイズします。
            Dim w = pixelSize.Width / 2
            Dim h = pixelSize.Height / 2
            Using sizedBmp = origBmp.Resize(w, h, InterpolationMode.Cubic),
                ib4bpp = sizedBmp.ToIndexed4bppBitmap(DitheringMethod.JarvisJudiceNinke),
                ib8bpp = sizedBmp.ToIndexed8bppBitmap(DitheringMethod.JarvisJudiceNinke),
                b4bpp = ib4bpp.ToGcBitmap(),
                b8bpp = ib8bpp.ToGcBitmap()
                '' 元の画像とインデックス付き画像を、結果のビットマップの4つの領域にコピーします。
                bmp.BitBlt(sizedBmp, 0, 0)
                b4bpp.Opaque = opaque
                bmp.BitBlt(b4bpp, w, 0)
                b8bpp.Opaque = opaque
                bmp.BitBlt(b8bpp, 0, h)
                bmp.BitBlt(sizedBmp, w, h)
            End Using

            '' 領域の間に境界線を追加し、それぞれにキャプションを追加します。
            Dim lineh = 2
            Using g = bmp.CreateGraphics(Nothing)
                Dim foreColor = Color.Yellow
                Dim backColor = Color.Blue
                Dim fnt = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "FreeMono.ttf"))
                g.DrawLine(w, 0, w, h * 2, New GCDRAW.Pen(foreColor, lineh * 2))
                g.DrawLine(0, h, w * 2, h, New GCDRAW.Pen(foreColor, lineh * 2))
                Dim tf = New TextFormat() With {.Font = fnt, .FontSize = 18, .ForeColor = foreColor, .BackColor = backColor, .FontBold = True}
                g.DrawString(" Original image ", tf, New PointF(0, 0))
                g.DrawString(" Indexed 4 bits per pixel ", tf, New PointF(w + lineh, 0))
                g.DrawString(" Indexed 8 bits per pixel ", tf, New PointF(0, h + lineh))
                g.DrawString(" Original image ", tf, New PointF(w + lineh, h + lineh))
            End Using
            Return bmp
        End Using
    End Function
End Class