BlendingModes.vb
'' 
'' このコードは、DioDocs for Imaging のサンプルの一部として提供されています。
'' © MESCIUS inc. All rights reserved.
'' 
Imports System.IO
Imports System.Drawing
Imports System.Collections.Generic
Imports System.Linq
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

'' このサンプルでは、利用可能な多くのブレンドモードの中からいくつかを使用して、
'' 2つの画像を合成する方法を実演します。
'' ベースとなる画像は、暗い背景に白い蘭が写った写真です。
'' 合成される画像はシンプルなスペクトル画像です(右下隅にサムネイルが表示されています)。
'' 利用可能なすべてのブレンドモードのデモについては、AllBlendingModes を参照してください。
Public Class BlendingModes
    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(), spectrumBmp = New GcBitmap()
            '' サンプル写真を読み込みます。
            Dim imagePath = Path.Combine("Resources", "ImagesBis", "orchid.jpg")
            Using stm = New FileStream(imagePath, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, FileOptions.RandomAccess)
                origBmp.Load(stm)
            End Using

            '' ブレンドに使用するソースを読み込みます。
            Dim spectrumPath = Path.Combine("Resources", "ImagesBis", "spectrum-500x500.png")
            Using stm = New FileStream(spectrumPath, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, FileOptions.RandomAccess)
                spectrumBmp.Load(stm)
            End Using

            origBmp.Opaque = opaque
            spectrumBmp.Opaque = opaque

            '' 生成されるビットマップ上に 4 つのサンプルを配置できるよう、
            '' 元の写真をリサイズします。
            Dim w = pixelSize.Width / 2
            Dim h = pixelSize.Height / 2
            Using sizedBmp = origBmp.Resize(w, h, InterpolationMode.Cubic), sizedSpectrumBmp = spectrumBmp.Resize(w, h)
                '' リサイズした元の画像を表示します。
                bmp.BitBlt(sizedBmp, 0, 0)

                '' ブレンドモード「Color」を適用します。
                bmp.BitBlt(sizedBmp, w, 0)
                bmp.CompositeAndBlend(sizedSpectrumBmp, w, 0, CompositeMode.SourceOver, BlendMode.Color)

                '' ブレンドモード「SoftLight」を適用します。
                bmp.BitBlt(sizedBmp, 0, h)
                bmp.CompositeAndBlend(sizedSpectrumBmp, 0, h, CompositeMode.SourceOver, BlendMode.SoftLight)

                '' ブレンドモード「Hue」を適用します。
                bmp.BitBlt(sizedBmp, w, h)
                bmp.CompositeAndBlend(sizedSpectrumBmp, w, h, CompositeMode.SourceOver, BlendMode.Hue)
            End Using
            '' 右下隅に、ブレンドソースのサムネイルを表示します。
            Using spectrumThumbnail = spectrumBmp.Resize(w / 4, h / 4)
                bmp.BitBlt(spectrumThumbnail, pixelSize.Width - spectrumThumbnail.PixelWidth, pixelSize.Height - spectrumThumbnail.PixelHeight)
            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(Color.Gray, lineh * 2))
                g.DrawLine(0, h, w * 2, h, New GCDRAW.Pen(Color.Gray, lineh * 2))
                Dim tf = New TextFormat() With {.Font = fnt, .FontSize = 18, .ForeColor = foreColor, .BackColor = backColor, .FontBold = True}
                Dim th = g.MeasureString("QWERTY", tf).Height
                g.DrawString(" Original image ", tf, New PointF(0, h - th + lineh))
                g.DrawString(" BlendMode.Color ", tf, New PointF(w + lineh, h - th + lineh))
                g.DrawString(" BlendMode.SoftLight ", tf, New PointF(0, h * 2 + lineh - th + lineh))
                g.DrawString(" BlendMode.Hue ", tf, New PointF(w + lineh, h * 2 + lineh - th + lineh))
            End Using
        End Using
        Return bmp
    End Function
End Class