'' 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.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

'' This sample demonstrates how to use GcBitmap.AutoLevel()
'' to automatically adjust the output levels of an image.
Public Class AutoLevels
    Function GenerateImage(
        ByVal pixelSize As Size,
        ByVal dpi As Single,
        ByVal opaque As Boolean,
        Optional ByVal sampleParams As String() = Nothing) As GcBitmap

        opaque = True
        Dim bmp = New GcBitmap(pixelSize.Width, pixelSize.Height, opaque, dpi, dpi)
        Using origBmp = New GcBitmap()
            '' Load a sample photo:
            Dim imagePath = Path.Combine("Resources", "ImagesBis", "red-yellow-wall.jpg")
            Using stm = New FileStream(imagePath, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, FileOptions.RandomAccess)
            End Using

            '' Resize the original photo to fit two versions on the resulting bitmap:
            Dim w = pixelSize.Width
            Dim h = pixelSize.Height / 2
            Using sizedBmp = origBmp.Resize(w, h, InterpolationMode.Cubic)
                '' Copy the resized original into the upper half of the resulting bitmap:
                bmp.BitBlt(sizedBmp, 0, 0)
                '' Auto adjust levels of the original And copy the result into the lower half:
                bmp.BitBlt(sizedBmp, 0, h)
            End Using

            '' Add captions (original And adjusted images):
            Dim lineh = 2
            Using g = bmp.CreateGraphics(Nothing)
                Dim forColor = Color.Yellow
                Dim bakColor = Color.Blue
                Dim fnt = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "cour.ttf"))
                g.DrawLine(0, h, w * 2, h, New GCDRAW.Pen(Color.Gray, lineh * 2))
                Dim tf = New TextFormat() With {.Font = fnt, .FontSize = 18, .ForeColor = forColor, .BackColor = bakColor, .FontBold = True}
                Dim th = g.MeasureString("QWERTY", tf).Height
                g.DrawString(" Original image ", tf, New PointF(0, h - th + lineh))
                g.DrawString(" Auto levels applied ", tf, New PointF(0, h * 2 + lineh - th + lineh))
            End Using
        End Using
        Return bmp
    End Function
End Class