UpdateGif.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.Collections.Generic
Imports System.Linq
Imports System.Numerics
Imports GrapeCity.Documents.Drawing
Imports GrapeCity.Documents.Text
Imports GrapeCity.Documents.Imaging

'' This sample loads an existing GIF and modifies its frames.
'' Specifically, it applies a color matrix to change the colors,
'' and flips the images horizontally.
'' The GIF loaded in this sample is the one produced by IndexedGif.
Public Class UpdateGif
    Function GenerateImageStream(
                ByVal targetEncoding As ImageEncoding,
                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 Stream

        If Not targetEncoding = ImageEncoding.Gif Then
            Throw New Exception("This sample only supports GIF output format.")
        End If

        '' Matrix to change colors to greenish blues:
        Dim colorMatrix = New ColorMatrix5x4() With
            {
                .M11 = 0.2F,
                .M12 = 0.3F,
                .M22 = 0.5F
            }

        Dim ms = New MemoryStream()
        '' Read source GIF, write modified one (change palette And flip And rotate frames)
        Using gr = New GcGifReader(Path.Combine("Resources", "Gifs", "goldfish-indexed.gif")), gw = New GcGifWriter(ms)

            Dim pal = gr.GetGlobalPalette()
            '' This sample will only work with GIFs that have a global palette
            If pal Is Nothing Then
                Throw New Exception("Source GIF does not have a global palette.")
            End If
            '' Use color matrix to update the palette
            Using palBmp = New GcBitmap(pal, pal.Length, 1, True)
                palBmp.ApplyColorMatrix(colorMatrix)
            End Using

            '' Set target paletter And other properties
            gw.GlobalPalette = pal
            gw.LogicalScreenWidth = gr.LogicalScreenWidth
            gw.LogicalScreenHeight = gr.LogicalScreenHeight
            gw.PixelAspectRatio = gr.PixelAspectRatio
            gw.AllowAddingTransparentColor = False
            Using tbmp = New GcBitmap()
                For i = 0 To gr.Frames.Count - 1
                    Dim frame = gr.Frames(i)
                    frame.ToGcBitmap(tbmp, i - 1)

                    '' Flip the image horizontally (this will reverse the 'rotation' of the fish):
                    Using bmp = tbmp.FlipRotate(FlipRotateAction.FlipHorizontal)
                        '' Apply the color matrix And append the frame to the target GIF:
                        bmp.ApplyColorMatrix(colorMatrix)
                        gw.AppendFrame(bmp, pal, DitheringMethod.NoDithering, 0, 0, GifDisposalMethod.DoNotDispose, frame.DelayTime, False)
                    End Using
                Next
            End Using
        End Using
        ms.Seek(0, SeekOrigin.Begin)
        Return ms
    End Function

    Public ReadOnly Property DefaultEncoding() As ImageEncoding
        Get
            Return ImageEncoding.Gif
        End Get
    End Property
End Class