EnlargeImage.vb
''
'' This code is part of GrapeCity Documents for Imaging samples.
'' Copyright (c) GrapeCity, 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

'' This sample shows how to enlarge a loaded image
'' using different interpolation modes.
Public Class EnlargeImage
    Function GenerateImage(
            Optional pixelWidth As Integer = 1024,
            Optional pixelHeight As Integer = 1024,
            Optional opaque As Boolean = True,
            Optional dpiX As Single = 96,
            Optional dpiY As Single = 96) As GcBitmap
        Dim origImagePath = Path.Combine("Resources", "Stock", "woman-window-small.jpg")
        '' Create and clear the target bitmap:
        Dim targetBmp = New GcBitmap(pixelWidth, pixelHeight, True, dpiX, dpiY)
        targetBmp.Clear(Color.Transparent)

        Const fontSize = 16, fpad = 4, xpad = 4, ypad = 3
        Dim tf = New TextFormat With
        {
            .Font = Font.FromFile(Path.Combine("Resources", "Fonts", "times.ttf")),
            .FontSize = fontSize
        }
        Using origBmp = New GcBitmap()
            Using stm = New FileStream(origImagePath, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, FileOptions.RandomAccess)
                origBmp.Load(stm)
            End Using

            '' Draw the original with the original size:
            targetBmp.BitBlt(origBmp, 0, 0)
            Using g = targetBmp.CreateGraphics(Nothing)
                g.DrawString($"⟵ Original image ({origBmp.Width} by {origBmp.Height} pixels)", tf, New PointF(origBmp.Width + fpad, fpad))
            End Using
            Dim dy = origBmp.Height + ypad

            '' Enlarge image so that we can have 4 enlarged tiled images preserving aspect ratio:
            Dim f = Math.Min(
                (targetBmp.Width - xpad) / origBmp.Width / 2,
                (targetBmp.Height - ypad - dy) / origBmp.Height / 2)
            Dim twidth = (origBmp.Width * f)
            Dim theight = (origBmp.Height * f)

            ''
            Dim drawCaption As Action(Of String, Single, Single) =
            Sub(caption, x, y)
                Using g = targetBmp.CreateGraphics(Nothing)
                    g.DrawString(caption, tf, New RectangleF(x + fpad, y + theight - fontSize - fpad * 2, twidth - fpad * 2, fontSize + fpad * 2))
                End Using
            End Sub

            '' Enlarge and draw 4 copies using the 4 available interpolation modes:
            Using bmp = origBmp.Resize(twidth, theight, InterpolationMode.NearestNeighbor)
                targetBmp.BitBlt(bmp, 0, dy)
            End Using
            drawCaption("InterpolationMode.NearestNeighbor", 0, dy)

            Using bmp = origBmp.Resize(twidth, theight, InterpolationMode.Linear)
                targetBmp.BitBlt(bmp, 0, dy + theight + ypad)
            End Using
            drawCaption("InterpolationMode.Linear", 0, dy + theight + ypad)

            Using bmp = origBmp.Resize(twidth, theight, InterpolationMode.Cubic)
                targetBmp.BitBlt(bmp, twidth + xpad, dy)
            End Using
            drawCaption("InterpolationMode.Cubic", twidth + xpad, dy)

            Using bmp = origBmp.Resize(twidth, theight, InterpolationMode.Downscale)
                targetBmp.BitBlt(bmp, twidth + xpad, dy + theight + ypad)
            End Using
            drawCaption("InterpolationMode.Downscale", twidth + xpad, dy + theight + ypad)
            ''
        End Using
        Return targetBmp
    End Function
End Class