Search Results for

    Show / Hide Table of Contents

    FlexCel image explorer (VB.Net / netframework)

    Note

    This demo is available in your FlexCel installation at <FlexCel Install Folder>\samples\vb\VS2022\netframework\10.API\30.FlexCelImageExplorer and also at https:​//​github.​com/​tmssoftware/​TMS-​FlexCel.​NET-​demos/​tree/​master/​vb/​VS2022/​netframework/​Modules/​10.​API/​30.​FlexCel​Image​Explorer

    Overview

    This is an application that will show all the images in an Excel file, to show their real size and bit depth. It will also allow you to extract those images to files. Note that the first time you open a file it can take some time, as it opens ALL the xls files on the folder and extracts all the image information so it can highlight files with problems.

    Concepts

    • How to use the API to read the images on a file.

    • How to convert the images to 256 colors or black and white using GDI+

    • On the left pane, files in red are files that have a cropped image. (that is, the image stored is larger than the image shown on Excel). Having this cropped image only consumes disk space, and makes rendering to pdf slower, as the image has to be decoded, cropped to the real size and encoded again.

    • Bold entries on the left pane are images with true color and transparency. Those images can get very big quite fast, so it is better if you can convert them to indexed color. Also, file with true color and transparency have to be re-encoded when exporting to pdf, making the process slower.

    Files

    AssemblyInfo.vb

    Imports System.Reflection
    Imports System.Runtime.CompilerServices
    
    '
    ' General Information about an assembly is controlled through the following 
    ' set of attributes. Change these attribute values to modify the information
    ' associated with an assembly.
    '
    <Assembly: AssemblyTitle("")>
    <Assembly: AssemblyDescription("")>
    <Assembly: AssemblyConfiguration("")>
    <Assembly: AssemblyCompany("")>
    <Assembly: AssemblyProduct("")>
    <Assembly: AssemblyCopyright("(c) 2002 - 2014 TMS Software")>
    <Assembly: AssemblyTrademark("")>
    <Assembly: AssemblyCulture("")>
    
    '
    ' Version information for an assembly consists of the following four values:
    '
    '      Major Version
    '      Minor Version 
    '      Build Number
    '      Revision
    '
    ' You can specify all the values or you can default the Revision and Build Numbers 
    ' by using the '*' as shown below:
    
    <Assembly: AssemblyVersion("6.2.1.0")>
    
    '
    ' In order to sign your assembly you must specify a key to use. Refer to the 
    ' Microsoft .NET Framework documentation for more information on assembly signing.
    '
    ' Use the attributes below to control which key is used for signing. 
    '
    ' Notes: 
    '   (*) If no key is specified, the assembly is not signed.
    '   (*) KeyName refers to a key that has been installed in the Crypto Service
    '       Provider (CSP) on your machine. KeyFile refers to a file which contains
    '       a key.
    '   (*) If the KeyFile and the KeyName values are both specified, the 
    '       following processing occurs:
    '       (1) If the KeyName can be found in the CSP, that key is used.
    '       (2) If the KeyName does not exist and the KeyFile does exist, the key 
    '           in the KeyFile is installed into the CSP and used.
    '   (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
    '       When specifying the KeyFile, the location of the KeyFile should be
    '       relative to the project output directory which is
    '       %Project Directory%\obj\<configuration>. For example, if your KeyFile is
    '       located in the project directory, you would specify the AssemblyKeyFile 
    '       attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
    '   (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
    '       documentation for more information on this.
    '
    <Assembly: AssemblyDelaySign(False)>
    <Assembly: AssemblyKeyFile("")>
    <Assembly: AssemblyKeyName("")>
    

    MainForm.Designer.vb

    Imports System.Collections
    Imports System.ComponentModel
    Imports System.IO
    Imports FlexCel.Core
    Imports FlexCel.XlsAdapter
    Namespace FlexCelImageExplorer
        Partial Public Class mainForm
            Inherits System.Windows.Forms.Form
    
            Private openFileDialog1 As System.Windows.Forms.OpenFileDialog
            Private panel1 As System.Windows.Forms.Panel
            Private splitter1 As System.Windows.Forms.Splitter
            Private panel3 As System.Windows.Forms.Panel
            Private WithEvents FilesListBox As System.Windows.Forms.ListBox
            Private lblFolder As System.Windows.Forms.Label
            Private dataGrid As System.Windows.Forms.DataGrid
            Private dataSet1 As System.Data.DataSet
            Private ImageDataTable As System.Data.DataTable
            Private Index As System.Data.DataColumn
            Private Cell1 As System.Data.DataColumn
            Private Cell2 As System.Data.DataColumn
            Private [cType] As System.Data.DataColumn
            Private cText As System.Data.DataColumn
            Private Description As System.Data.DataColumn
            Private dataColumn1 As System.Data.DataColumn
            Private panel4 As System.Windows.Forms.Panel
            Private splitter2 As System.Windows.Forms.Splitter
            Private dataColumn2 As System.Data.DataColumn
            Private PreviewBox As System.Windows.Forms.PictureBox
            Private dataColumn3 As System.Data.DataColumn
            Private saveImageDialog As System.Windows.Forms.SaveFileDialog
            Private dataColumn4 As System.Data.DataColumn
            Private components As System.ComponentModel.IContainer = Nothing
    
            ''' <summary>
            ''' Clean up any resources being used.
            ''' </summary>
            Protected Overrides Sub Dispose(ByVal disposing As Boolean)
                If disposing Then
                    If components IsNot Nothing Then
                        components.Dispose()
                    End If
                End If
                MyBase.Dispose(disposing)
            End Sub
    
            #Region "Windows Form Designer generated code"
            ''' <summary>
            ''' Required method for Designer support - do not modify
            ''' the contents of this method with the code editor.
            ''' </summary>
            Private Sub InitializeComponent()
                Dim resources As New System.ComponentModel.ComponentResourceManager(GetType(mainForm))
                Me.openFileDialog1 = New System.Windows.Forms.OpenFileDialog()
                Me.panel1 = New System.Windows.Forms.Panel()
                Me.FilesListBox = New System.Windows.Forms.ListBox()
                Me.panel3 = New System.Windows.Forms.Panel()
                Me.lblFolder = New System.Windows.Forms.Label()
                Me.splitter1 = New System.Windows.Forms.Splitter()
                Me.dataGrid = New System.Windows.Forms.DataGrid()
                Me.ImageDataTable = New System.Data.DataTable()
                Me.dataColumn4 = New System.Data.DataColumn()
                Me.Index = New System.Data.DataColumn()
                Me.Cell1 = New System.Data.DataColumn()
                Me.Cell2 = New System.Data.DataColumn()
                Me.cType = New System.Data.DataColumn()
                Me.cText = New System.Data.DataColumn()
                Me.Description = New System.Data.DataColumn()
                Me.dataColumn1 = New System.Data.DataColumn()
                Me.dataColumn2 = New System.Data.DataColumn()
                Me.dataColumn3 = New System.Data.DataColumn()
                Me.dataSet1 = New System.Data.DataSet()
                Me.panel4 = New System.Windows.Forms.Panel()
                Me.PreviewBox = New System.Windows.Forms.PictureBox()
                Me.splitter2 = New System.Windows.Forms.Splitter()
                Me.saveImageDialog = New System.Windows.Forms.SaveFileDialog()
                Me.mainToolbar = New System.Windows.Forms.ToolStrip()
                Me.cbScanFolder = New System.Windows.Forms.ToolStripButton()
                Me.btnOpenFile = New System.Windows.Forms.ToolStripButton()
                Me.toolStripSeparator1 = New System.Windows.Forms.ToolStripSeparator()
                Me.btnShowInExcel = New System.Windows.Forms.ToolStripButton()
                Me.btnSaveAsImage = New System.Windows.Forms.ToolStripButton()
                Me.btnExit = New System.Windows.Forms.ToolStripButton()
                Me.btnInfo = New System.Windows.Forms.ToolStripButton()
                Me.toolStripSeparator2 = New System.Windows.Forms.ToolStripSeparator()
                Me.btnStretchPreview = New System.Windows.Forms.ToolStripButton()
                Me.panel1.SuspendLayout()
                Me.panel3.SuspendLayout()
                CType(Me.dataGrid, System.ComponentModel.ISupportInitialize).BeginInit()
                CType(Me.ImageDataTable, System.ComponentModel.ISupportInitialize).BeginInit()
                CType(Me.dataSet1, System.ComponentModel.ISupportInitialize).BeginInit()
                Me.panel4.SuspendLayout()
                CType(Me.PreviewBox, System.ComponentModel.ISupportInitialize).BeginInit()
                Me.mainToolbar.SuspendLayout()
                Me.SuspendLayout()
                ' 
                ' openFileDialog1
                ' 
                Me.openFileDialog1.DefaultExt = "xls"
                Me.openFileDialog1.Filter = "Excel Files|*.xls;*.xlsx;*.xlsm|Excel 97/2003|*.xls|Excel 2007|*.xlsx;*.xlsm|All " & "files|*.*"
                Me.openFileDialog1.Title = "Open an Excel File"
                ' 
                ' panel1
                ' 
                Me.panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D
                Me.panel1.Controls.Add(Me.FilesListBox)
                Me.panel1.Controls.Add(Me.panel3)
                Me.panel1.Dock = System.Windows.Forms.DockStyle.Left
                Me.panel1.Location = New System.Drawing.Point(0, 38)
                Me.panel1.Name = "panel1"
                Me.panel1.Size = New System.Drawing.Size(176, 400)
                Me.panel1.TabIndex = 4
                ' 
                ' FilesListBox
                ' 
                Me.FilesListBox.Dock = System.Windows.Forms.DockStyle.Fill
                Me.FilesListBox.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed
                Me.FilesListBox.Location = New System.Drawing.Point(0, 40)
                Me.FilesListBox.Name = "FilesListBox"
                Me.FilesListBox.Size = New System.Drawing.Size(172, 356)
                Me.FilesListBox.TabIndex = 1
    '           Me.FilesListBox.DrawItem += New System.Windows.Forms.DrawItemEventHandler(Me.FilesListBox_DrawItem)
    '           Me.FilesListBox.SelectedIndexChanged += New System.EventHandler(Me.FilesListBox_SelectedIndexChanged)
                ' 
                ' panel3
                ' 
                Me.panel3.BackColor = System.Drawing.Color.DarkSeaGreen
                Me.panel3.Controls.Add(Me.lblFolder)
                Me.panel3.Dock = System.Windows.Forms.DockStyle.Top
                Me.panel3.Location = New System.Drawing.Point(0, 0)
                Me.panel3.Name = "panel3"
                Me.panel3.Size = New System.Drawing.Size(172, 40)
                Me.panel3.TabIndex = 0
                ' 
                ' lblFolder
                ' 
                Me.lblFolder.Dock = System.Windows.Forms.DockStyle.Fill
                Me.lblFolder.ForeColor = System.Drawing.Color.Black
                Me.lblFolder.Location = New System.Drawing.Point(0, 0)
                Me.lblFolder.Name = "lblFolder"
                Me.lblFolder.Size = New System.Drawing.Size(172, 40)
                Me.lblFolder.TabIndex = 0
                Me.lblFolder.Text = "No Selected Folder."
                ' 
                ' splitter1
                ' 
                Me.splitter1.Location = New System.Drawing.Point(176, 38)
                Me.splitter1.Name = "splitter1"
                Me.splitter1.Size = New System.Drawing.Size(3, 400)
                Me.splitter1.TabIndex = 5
                Me.splitter1.TabStop = False
                ' 
                ' dataGrid
                ' 
                Me.dataGrid.CaptionText = "No file selected"
                Me.dataGrid.DataMember = ""
                Me.dataGrid.DataSource = Me.ImageDataTable
                Me.dataGrid.Dock = System.Windows.Forms.DockStyle.Top
                Me.dataGrid.HeaderForeColor = System.Drawing.SystemColors.ControlText
                Me.dataGrid.Location = New System.Drawing.Point(179, 38)
                Me.dataGrid.Name = "dataGrid"
                Me.dataGrid.PreferredColumnWidth = 120
                Me.dataGrid.ReadOnly = True
                Me.dataGrid.Size = New System.Drawing.Size(709, 128)
                Me.dataGrid.TabIndex = 7
                ' 
                ' ImageDataTable
                ' 
                Me.ImageDataTable.Columns.AddRange(New System.Data.DataColumn() { Me.dataColumn4, Me.Index, Me.Cell1, Me.Cell2, Me.cType, Me.cText, Me.Description, Me.dataColumn1, Me.dataColumn2, Me.dataColumn3})
                Me.ImageDataTable.TableName = "ImageDataTable"
                ' 
                ' dataColumn4
                ' 
                Me.dataColumn4.ColumnName = "Sheet"
                ' 
                ' Index
                ' 
                Me.Index.ColumnName = "Index"
                ' 
                ' Cell1
                ' 
                Me.Cell1.Caption = "Width (Pixels)"
                Me.Cell1.ColumnName = "Width (Pixels)"
                ' 
                ' Cell2
                ' 
                Me.Cell2.Caption = "Height (Pixels)"
                Me.Cell2.ColumnName = "Height (Pixels)"
                ' 
                ' cType
                ' 
                Me.cType.ColumnName = "Type"
                ' 
                ' cText
                ' 
                Me.cText.Caption = "Image Format"
                Me.cText.ColumnName = "Image Format"
                ' 
                ' Description
                ' 
                Me.Description.Caption = "Uncompressed size"
                Me.Description.ColumnName = "Uncompressed size"
                ' 
                ' dataColumn1
                ' 
                Me.dataColumn1.Caption = "Name"
                Me.dataColumn1.ColumnName = "Name"
                ' 
                ' dataColumn2
                ' 
                Me.dataColumn2.ColumnMapping = System.Data.MappingType.Hidden
                Me.dataColumn2.ColumnName = "Image"
                Me.dataColumn2.DataType = GetType(Byte())
                ' 
                ' dataColumn3
                ' 
                Me.dataColumn3.ColumnName = "Cropped"
                Me.dataColumn3.DataType = GetType(Boolean)
                ' 
                ' dataSet1
                ' 
                Me.dataSet1.DataSetName = "ImageDataSet"
                Me.dataSet1.Locale = New System.Globalization.CultureInfo("")
                Me.dataSet1.Tables.AddRange(New System.Data.DataTable() { Me.ImageDataTable})
                ' 
                ' panel4
                ' 
                Me.panel4.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D
                Me.panel4.Controls.Add(Me.PreviewBox)
                Me.panel4.Dock = System.Windows.Forms.DockStyle.Fill
                Me.panel4.Location = New System.Drawing.Point(179, 169)
                Me.panel4.Name = "panel4"
                Me.panel4.Size = New System.Drawing.Size(709, 269)
                Me.panel4.TabIndex = 8
                ' 
                ' PreviewBox
                ' 
                Me.PreviewBox.Dock = System.Windows.Forms.DockStyle.Fill
                Me.PreviewBox.Location = New System.Drawing.Point(0, 0)
                Me.PreviewBox.Name = "PreviewBox"
                Me.PreviewBox.Size = New System.Drawing.Size(705, 265)
                Me.PreviewBox.TabIndex = 0
                Me.PreviewBox.TabStop = False
                ' 
                ' splitter2
                ' 
                Me.splitter2.Dock = System.Windows.Forms.DockStyle.Top
                Me.splitter2.Location = New System.Drawing.Point(179, 166)
                Me.splitter2.Name = "splitter2"
                Me.splitter2.Size = New System.Drawing.Size(709, 3)
                Me.splitter2.TabIndex = 9
                Me.splitter2.TabStop = False
                ' 
                ' mainToolbar
                ' 
                Me.mainToolbar.Items.AddRange(New System.Windows.Forms.ToolStripItem() { Me.cbScanFolder, Me.btnOpenFile, Me.toolStripSeparator1, Me.btnShowInExcel, Me.btnSaveAsImage, Me.btnExit, Me.btnInfo, Me.toolStripSeparator2, Me.btnStretchPreview})
                Me.mainToolbar.Location = New System.Drawing.Point(0, 0)
                Me.mainToolbar.Name = "mainToolbar"
                Me.mainToolbar.Size = New System.Drawing.Size(888, 38)
                Me.mainToolbar.TabIndex = 12
                Me.mainToolbar.Text = "toolStrip1"
                ' 
                ' cbScanFolder
                ' 
                Me.cbScanFolder.CheckOnClick = True
                Me.cbScanFolder.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text
                Me.cbScanFolder.Image = (CType(resources.GetObject("cbScanFolder.Image"), System.Drawing.Image))
                Me.cbScanFolder.ImageTransparentColor = System.Drawing.Color.Magenta
                Me.cbScanFolder.Name = "cbScanFolder"
                Me.cbScanFolder.Size = New System.Drawing.Size(122, 35)
                Me.cbScanFolder.Text = "Scan all files in folder"
                Me.cbScanFolder.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText
                ' 
                ' btnOpenFile
                ' 
                Me.btnOpenFile.Image = (CType(resources.GetObject("btnOpenFile.Image"), System.Drawing.Image))
                Me.btnOpenFile.ImageTransparentColor = System.Drawing.Color.Magenta
                Me.btnOpenFile.Name = "btnOpenFile"
                Me.btnOpenFile.Size = New System.Drawing.Size(59, 35)
                Me.btnOpenFile.Text = "Open file"
                Me.btnOpenFile.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText
    '           Me.btnOpenFile.Click += New System.EventHandler(Me.btnOpenFile_Click)
                ' 
                ' toolStripSeparator1
                ' 
                Me.toolStripSeparator1.Name = "toolStripSeparator1"
                Me.toolStripSeparator1.Size = New System.Drawing.Size(6, 38)
                ' 
                ' btnShowInExcel
                ' 
                Me.btnShowInExcel.Image = (CType(resources.GetObject("btnShowInExcel.Image"), System.Drawing.Image))
                Me.btnShowInExcel.ImageTransparentColor = System.Drawing.Color.Magenta
                Me.btnShowInExcel.Name = "btnShowInExcel"
                Me.btnShowInExcel.Size = New System.Drawing.Size(82, 35)
                Me.btnShowInExcel.Text = "Show in Excel"
                Me.btnShowInExcel.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText
    '           Me.btnShowInExcel.Click += New System.EventHandler(Me.btnOpen_Click)
                ' 
                ' btnSaveAsImage
                ' 
                Me.btnSaveAsImage.Image = (CType(resources.GetObject("btnSaveAsImage.Image"), System.Drawing.Image))
                Me.btnSaveAsImage.ImageTransparentColor = System.Drawing.Color.Magenta
                Me.btnSaveAsImage.Name = "btnSaveAsImage"
                Me.btnSaveAsImage.Size = New System.Drawing.Size(85, 35)
                Me.btnSaveAsImage.Text = "Save as image"
                Me.btnSaveAsImage.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText
    '           Me.btnSaveAsImage.Click += New System.EventHandler(Me.btnSaveImage_Click)
                ' 
                ' btnExit
                ' 
                Me.btnExit.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right
                Me.btnExit.Image = (CType(resources.GetObject("btnExit.Image"), System.Drawing.Image))
                Me.btnExit.ImageTransparentColor = System.Drawing.Color.Magenta
                Me.btnExit.Name = "btnExit"
                Me.btnExit.Size = New System.Drawing.Size(59, 35)
                Me.btnExit.Text = "     E&xit     "
                Me.btnExit.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText
    '           Me.btnExit.Click += New System.EventHandler(Me.btnExit_Click)
                ' 
                ' btnInfo
                ' 
                Me.btnInfo.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right
                Me.btnInfo.Image = (CType(resources.GetObject("btnInfo.Image"), System.Drawing.Image))
                Me.btnInfo.ImageTransparentColor = System.Drawing.Color.Magenta
                Me.btnInfo.Name = "btnInfo"
                Me.btnInfo.Size = New System.Drawing.Size(74, 35)
                Me.btnInfo.Text = "Information"
                Me.btnInfo.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText
    '           Me.btnInfo.Click += New System.EventHandler(Me.btnInfo_Click)
                ' 
                ' toolStripSeparator2
                ' 
                Me.toolStripSeparator2.Name = "toolStripSeparator2"
                Me.toolStripSeparator2.Size = New System.Drawing.Size(6, 38)
                ' 
                ' btnStretchPreview
                ' 
                Me.btnStretchPreview.CheckOnClick = True
                Me.btnStretchPreview.Image = (CType(resources.GetObject("btnStretchPreview.Image"), System.Drawing.Image))
                Me.btnStretchPreview.ImageTransparentColor = System.Drawing.Color.Magenta
                Me.btnStretchPreview.Name = "btnStretchPreview"
                Me.btnStretchPreview.Size = New System.Drawing.Size(92, 35)
                Me.btnStretchPreview.Text = "Stretch preview"
                Me.btnStretchPreview.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText
    '           Me.btnStretchPreview.Click += New System.EventHandler(Me.btnStretchPreview_Click)
                ' 
                ' mainForm
                ' 
                Me.AutoScaleDimensions = New System.Drawing.SizeF(6F, 13F)
                Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
                Me.ClientSize = New System.Drawing.Size(888, 438)
                Me.Controls.Add(Me.panel4)
                Me.Controls.Add(Me.splitter2)
                Me.Controls.Add(Me.dataGrid)
                Me.Controls.Add(Me.splitter1)
                Me.Controls.Add(Me.panel1)
                Me.Controls.Add(Me.mainToolbar)
                Me.Name = "mainForm"
                Me.Text = "FlexCel Image Explorer"
                Me.WindowState = System.Windows.Forms.FormWindowState.Maximized
                Me.panel1.ResumeLayout(False)
                Me.panel3.ResumeLayout(False)
                CType(Me.dataGrid, System.ComponentModel.ISupportInitialize).EndInit()
                CType(Me.ImageDataTable, System.ComponentModel.ISupportInitialize).EndInit()
                CType(Me.dataSet1, System.ComponentModel.ISupportInitialize).EndInit()
                Me.panel4.ResumeLayout(False)
                CType(Me.PreviewBox, System.ComponentModel.ISupportInitialize).EndInit()
                Me.mainToolbar.ResumeLayout(False)
                Me.mainToolbar.PerformLayout()
                Me.ResumeLayout(False)
                Me.PerformLayout()
    
            End Sub
            #End Region
    
            Private mainToolbar As ToolStrip
            Private WithEvents btnOpenFile As ToolStripButton
            Private toolStripSeparator1 As ToolStripSeparator
            Private WithEvents btnShowInExcel As ToolStripButton
            Private WithEvents btnSaveAsImage As ToolStripButton
            Private WithEvents btnExit As ToolStripButton
            Private WithEvents btnInfo As ToolStripButton
            Private toolStripSeparator2 As ToolStripSeparator
            Private WithEvents btnStretchPreview As ToolStripButton
            Private cbScanFolder As ToolStripButton
        End Class
    End Namespace
    

    MainForm.vb

    Imports System.Collections
    Imports System.ComponentModel
    Imports System.IO
    
    Imports FlexCel.Core
    Imports FlexCel.XlsAdapter
    
    Namespace FlexCelImageExplorer
        ''' <summary>
        ''' Image Explorer.
        ''' </summary>
        Partial Public Class mainForm
            Inherits System.Windows.Forms.Form
    
            Public Sub New()
                InitializeComponent()
                AddHandler GetCurrencyManager.CurrentChanged, AddressOf CurrentRowChanged
                ResizeToolbar(mainToolbar)
            End Sub
    
            Private Sub ResizeToolbar(ByVal toolbar As ToolStrip)
    
                Using gr As Graphics = CreateGraphics()
                    Dim xFactor As Double = gr.DpiX / 96.0
                    Dim yFactor As Double = gr.DpiY / 96.0
                    toolbar.ImageScalingSize = New Size(CInt(Fix(24 * xFactor)), CInt(Fix(24 * yFactor)))
                    toolbar.Width = 0 'force a recalc of the buttons.
                End Using
            End Sub
    
            Private CurrentFilename As String = Nothing
            Private CompressForm As TCompressForm
    
            Private ReadOnly Property GetCurrencyManager() As CurrencyManager
                Get
                    Return CType(Me.BindingContext(dataGrid.DataSource, dataGrid.DataMember), CurrencyManager)
                End Get
            End Property
    
            Private ReadOnly Property GetImagePos() As Integer
                Get
                    Return GetCurrencyManager.Position
                End Get
            End Property
    
            Private Sub btnExit_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnExit.Click
                Close()
            End Sub
    
            Private Sub btnOpenFile_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnOpenFile.Click
                If openFileDialog1.ShowDialog() <> System.Windows.Forms.DialogResult.OK Then
                    Return
                End If
                OpenFile(openFileDialog1.FileName)
                If cbScanFolder.Checked Then
                    FillListBox()
                End If
            End Sub
    
            Private Function GetHasCrop(ByVal ImgProps As TImageProperties) As Boolean
                Return ImgProps.CropArea.CropFromLeft <> 0 OrElse ImgProps.CropArea.CropFromRight <> 0 OrElse ImgProps.CropArea.CropFromTop <> 0 OrElse ImgProps.CropArea.CropFromBottom <> 0
            End Function
    
            Private Sub FillListBox()
                lblFolder.Text = "Files on folder: " & Path.GetDirectoryName(openFileDialog1.FileName)
                Dim di As New DirectoryInfo(Path.GetDirectoryName(openFileDialog1.FileName))
                Dim Fi() As FileInfo = di.GetFiles("*.xls")
                FilesListBox.Items.Clear()
    
                Dim Files(Fi.Length - 1) As TImageInfo
    
                For k As Integer = 0 To Fi.Length - 1
                    Dim f As FileInfo = Fi(k)
                    Dim HasCrop As Boolean = False
                    Dim HasARGB As Boolean = False
                    Dim x1 As New XlsFile()
    
                    Dim HasImages As Boolean = False
    
                    Try
                        x1.Open(f.FullName)
                        For sheet As Integer = 1 To x1.SheetCount
                            x1.ActiveSheet = sheet
                            For i As Integer = x1.ImageCount To 1 Step -1
                                HasImages = True
                                Dim ip As TImageProperties = x1.GetImageProperties(i)
                                If Not HasCrop Then
                                    HasCrop = GetHasCrop(ip)
                                End If
    
                                Dim imgType As TXlsImgType = TXlsImgType.Unknown
                                Using ms As New MemoryStream()
                                    x1.GetImage(i, imgType, ms)
                                    Dim PngInfo As FlexCel.Pdf.TPngInformation = FlexCel.Pdf.TPdfPng.GetPngInfo(ms)
                                    If PngInfo IsNot Nothing Then
                                        HasARGB = PngInfo.ColorType = 6
                                    End If
                                End Using
    
                            Next i
                        Next sheet
                    Catch e1 As Exception
                        Files(k) = New TImageInfo(f, False, False, False, False)
                        Continue For
                    End Try
    
                    Files(k) = New TImageInfo(f, True, HasCrop, HasImages, HasARGB)
                Next k
    
                FilesListBox.Items.AddRange(Files)
            End Sub
    
            Private Sub OpenFile(ByVal FileName As String)
                ImageDataTable.Rows.Clear()
    
                Try
                    Dim Xls As New XlsFile(True)
                    CurrentFilename = FileName
                    Xls.Open(FileName)
    
                    For sheet As Integer = 1 To Xls.SheetCount
                        Xls.ActiveSheet = sheet
                        For i As Integer = Xls.ImageCount To 1 Step -1
                            Dim ImageType As TXlsImgType = TXlsImgType.Unknown
                            Dim ImgBytes() As Byte = Xls.GetImage(i, ImageType)
                            Dim ImgProps As TImageProperties = Xls.GetImageProperties(i)
                            Dim ImgData(ImageDataTable.Columns.Count - 1) As Object
                            ImgData(0) = Xls.SheetName
                            ImgData(1) = i
                            ImgData(4) = ImageType.ToString()
                            ImgData(7) = Xls.GetImageName(i)
                            ImgData(8) = ImgBytes
                            ImgData(9) = GetHasCrop(ImgProps)
    
    
                            Using ms As New MemoryStream(ImgBytes)
                                Dim PngInfo As FlexCel.Pdf.TPngInformation = FlexCel.Pdf.TPdfPng.GetPngInfo(ms)
                                If PngInfo IsNot Nothing Then
                                    ImgData(2) = PngInfo.Width
                                    ImgData(3) = PngInfo.Height
                                    Dim s As String = String.Empty
                                    Dim bpp As Integer = 0
    
                                    If (PngInfo.ColorType And 4) <> 0 Then
                                        s &= "ALPHA-"
                                        bpp = 1
                                    End If
                                    If (PngInfo.ColorType And 2) = 0 Then
                                        s &= "Grayscale -" & (1 << PngInfo.BitDepth).ToString() & " shades. "
                                        bpp = 1
                                    Else
                                        If (PngInfo.ColorType And 1) = 0 Then
                                            bpp += 3
                                            s &= "RGB - " & (PngInfo.BitDepth * (bpp)).ToString() & "bpp.  "
                                        Else
                                            s &= "Indexed - " & (1 << PngInfo.BitDepth).ToString() & " colors. "
                                            bpp = 1
                                        End If
                                    End If
    
                                    ImgData(5) = s
    
                                    ImgData(6) = (Math.Round(PngInfo.Width * PngInfo.Height * PngInfo.BitDepth * bpp / 8F / 1024F)).ToString() & " kb."
                                Else
                                    ms.Position = 0
                                    Try
                                        Using Img As Image = Image.FromStream(ms)
                                            Dim Bmp As Bitmap = TryCast(Img, Bitmap)
                                            If Bmp IsNot Nothing Then
                                                ImgData(5) = Bmp.PixelFormat.ToString() & "bpp"
                                            End If
                                            ImgData(2) = Img.Width
                                            ImgData(3) = Img.Height
                                        End Using
                                    Catch e1 As Exception
                                        ImgData(2) = -1
                                        ImgData(3) = -1
                                        ImgData(5) = Nothing
                                        ImgData(8) = Nothing
    
                                    End Try
                                End If
                            End Using
    
    
                            ImageDataTable.Rows.Add(ImgData)
                        Next i
                    Next sheet
    
                Catch ex As Exception
                    MessageBox.Show(ex.Message, "Error")
                    dataGrid.CaptionText = "No file selected"
                    CurrentFilename = Nothing
                    Return
                End Try
                dataGrid.CaptionText = "Selected file: " & FileName
                CurrentRowChanged(GetCurrencyManager, Nothing)
            End Sub
    
            Private Sub FilesListBox_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles FilesListBox.SelectedIndexChanged
                Dim ImageInfo As TImageInfo = CType(FilesListBox.SelectedItem, TImageInfo)
                If ImageInfo Is Nothing Then
                    Return
                End If
                OpenFile(ImageInfo.File.FullName)
            End Sub
    
            Public Sub CurrentRowChanged(ByVal sender As Object, ByVal e As System.EventArgs)
                Dim Pos As Integer = CType(sender, BindingManagerBase).Position
                If Pos < 0 Then
                    PreviewBox.Image = Nothing
                    Return
                End If
    
                Dim r As DataRowCollection = dataSet1.Tables("ImageDataTable").Rows
                If Pos < 0 OrElse Pos >= r.Count Then
                    PreviewBox.Image = Nothing
                Else
                    Dim ImgData() As Byte = TryCast(r(Pos).ItemArray(8), Byte())
                    If ImgData Is Nothing Then
                        PreviewBox.Image = Nothing
                    Else
                        Using ms As New MemoryStream(ImgData)
                            PreviewBox.Image = Image.FromStream(ms)
                        End Using
                    End If
                End If
            End Sub
    
            Private Sub btnOpen_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnShowInExcel.Click
                If CurrentFilename Is Nothing Then
                    MessageBox.Show("There is no open file")
                    Return
                End If
                System.Diagnostics.Process.Start(CurrentFilename)
            End Sub
    
            Private Sub btnConvert_Click(ByVal sender As Object, ByVal e As System.EventArgs)
                'This is not yet implemented...
                Dim Pos As Integer = GetImagePos
                If Pos < 0 Then
                    MessageBox.Show("There is no selected image", "Error")
                    Return
                End If
                If CompressForm Is Nothing Then
                    CompressForm = New TCompressForm()
                End If
                CompressForm.ImageToUse = CType(dataSet1.Tables("ImageDataTable").Rows(Pos).ItemArray(8), Byte())
                CompressForm.XlsFilename = CurrentFilename
                CompressForm.ShowDialog()
            End Sub
    
            Private Sub FilesListBox_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles FilesListBox.DrawItem
                If e.Index < 0 Then
                    Return
                End If
                e.DrawBackground()
                Dim myBrush As Brush = Brushes.Black
    
                Dim ImageInfo As TImageInfo = CType(CType(sender, ListBox).Items(e.Index), TImageInfo)
                If Not ImageInfo.HasImages Then
                    myBrush = Brushes.Silver
                End If
                If ImageInfo.HasCrop Then
                    myBrush = Brushes.Red
                End If
    
                Dim NewStyle As FontStyle
                If ImageInfo.HasARGB Then
                    NewStyle = FontStyle.Bold
                Else
                    NewStyle = FontStyle.Regular
                End If
                Using MyFont As New Font(e.Font, NewStyle)
                    e.Graphics.DrawString(ImageInfo.ToString(), MyFont, myBrush, e.Bounds, StringFormat.GenericDefault)
                End Using
                e.DrawFocusRectangle()
            End Sub
    
            Private Sub btnSaveImage_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSaveAsImage.Click
                Dim Pos As Integer = GetImagePos
                If Pos < 0 Then
                    MessageBox.Show("There is no selected image to save", "Error")
                    Return
                End If
    
                Dim ext As String = dataSet1.Tables("ImageDataTable").Rows(Pos).ItemArray(4).ToString().ToLower()
                saveImageDialog.DefaultExt = ext
                saveImageDialog.Filter = ext & " Images|*." & ext
                If saveImageDialog.ShowDialog() <> System.Windows.Forms.DialogResult.OK Then
                    Return
                End If
                Dim ImgData() As Byte = CType(dataSet1.Tables("ImageDataTable").Rows(Pos).ItemArray(8), Byte())
                Using fs As New FileStream(saveImageDialog.FileName, FileMode.Create)
                    fs.Write(ImgData, 0, ImgData.Length)
                End Using
    
            End Sub
    
            Private Sub btnInfo_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnInfo.Click
                MessageBox.Show("FlexCelImageExplorer is a small application targeted to reduce the size on images inside Excel files." & vbLf & "On the current version you can see the image properties and extract the images to disk.")
    
            End Sub
    
            Private Sub btnStretchPreview_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnStretchPreview.Click
                If btnStretchPreview.Checked Then
                    PreviewBox.SizeMode = PictureBoxSizeMode.StretchImage
                Else
                    PreviewBox.SizeMode = PictureBoxSizeMode.Normal
                End If
            End Sub
    
        End Class
    
        Friend Class TImageInfo
            Friend File As FileInfo
            Friend IsValidFile As Boolean
            Friend HasCrop As Boolean
            Friend HasImages As Boolean
            Friend HasARGB As Boolean
    
            Public Sub New(ByVal aFile As FileInfo, ByVal aIsValidFile As Boolean, ByVal aHasCrop As Boolean, ByVal aHasImages As Boolean, ByVal aHasARGB As Boolean)
                File = aFile
                HasCrop = aHasCrop
                HasImages = aHasImages
                IsValidFile = aIsValidFile
                HasARGB = aHasARGB
            End Sub
    
            Public Overrides Function ToString() As String
                If Not IsValidFile Then
                    Return " (*)" & File.ToString()
                End If
                Return File.ToString()
            End Function
    
        End Class
    End Namespace
    

    Program.vb

    Namespace FlexCelImageExplorer
        Friend NotInheritable Class Program
    
            Private Sub New()
            End Sub
    
            ''' <summary>
            ''' The main entry point for the application.
            ''' </summary>
           <STAThread> _
            Shared Sub Main()
                Application.EnableVisualStyles()
                Application.SetCompatibleTextRenderingDefault(False)
                Application.Run(New mainForm())
            End Sub
        End Class
    End Namespace
    

    TCompressForm.Designer.vb

    Imports System.Collections
    Imports System.ComponentModel
    Imports System.IO
    Namespace FlexCelImageExplorer
        Partial Public Class TCompressForm
            Inherits System.Windows.Forms.Form
    
            Private label1 As System.Windows.Forms.Label
            Private edPercent As System.Windows.Forms.NumericUpDown
            Private cbPixelFormat As System.Windows.Forms.ComboBox
            Private WithEvents btnOk As System.Windows.Forms.Button
            Private WithEvents btnCancel As System.Windows.Forms.Button
            Private panel1 As System.Windows.Forms.Panel
            Private panel2 As System.Windows.Forms.Panel
            Private pictureBox1 As System.Windows.Forms.PictureBox
            Private cbTransparent As System.Windows.Forms.CheckBox
            ''' <summary>
            ''' Required designer variable.
            ''' </summary>
            Private components As System.ComponentModel.Container = Nothing
    
            ''' <summary>
            ''' Clean up any resources being used.
            ''' </summary>
            Protected Overrides Sub Dispose(ByVal disposing As Boolean)
                If disposing Then
                    If components IsNot Nothing Then
                        components.Dispose()
                    End If
                End If
                MyBase.Dispose(disposing)
            End Sub
    
            #Region "Windows Form Designer generated code"
            ''' <summary>
            ''' Required method for Designer support - do not modify
            ''' the contents of this method with the code editor.
            ''' </summary>
            Private Sub InitializeComponent()
                Me.label1 = New System.Windows.Forms.Label()
                Me.edPercent = New System.Windows.Forms.NumericUpDown()
                Me.cbPixelFormat = New System.Windows.Forms.ComboBox()
                Me.btnOk = New System.Windows.Forms.Button()
                Me.btnCancel = New System.Windows.Forms.Button()
                Me.panel1 = New System.Windows.Forms.Panel()
                Me.panel2 = New System.Windows.Forms.Panel()
                Me.pictureBox1 = New System.Windows.Forms.PictureBox()
                Me.cbTransparent = New System.Windows.Forms.CheckBox()
                CType(Me.edPercent, System.ComponentModel.ISupportInitialize).BeginInit()
                Me.panel1.SuspendLayout()
                Me.panel2.SuspendLayout()
                Me.SuspendLayout()
                ' 
                ' label1
                ' 
                Me.label1.Location = New System.Drawing.Point(16, 8)
                Me.label1.Name = "label1"
                Me.label1.Size = New System.Drawing.Size(144, 16)
                Me.label1.TabIndex = 0
                Me.label1.Text = "Change Resolution (%):"
                ' 
                ' edPercent
                ' 
                Me.edPercent.Increment = New System.Decimal(New Integer() { 5, 0, 0, 0})
                Me.edPercent.Location = New System.Drawing.Point(176, 8)
                Me.edPercent.Minimum = New System.Decimal(New Integer() { 10, 0, 0, 0})
                Me.edPercent.Name = "edPercent"
                Me.edPercent.Size = New System.Drawing.Size(48, 20)
                Me.edPercent.TabIndex = 2
                Me.edPercent.Value = New System.Decimal(New Integer() { 60, 0, 0, 0})
                ' 
                ' cbPixelFormat
                ' 
                Me.cbPixelFormat.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList
                Me.cbPixelFormat.Items.AddRange(New Object() { "1bpp (Black and White)", "8bpp (256 colors optimized palette)", "24bpp (true color)"})
                Me.cbPixelFormat.Location = New System.Drawing.Point(16, 40)
                Me.cbPixelFormat.Name = "cbPixelFormat"
                Me.cbPixelFormat.Size = New System.Drawing.Size(208, 21)
                Me.cbPixelFormat.TabIndex = 3
                ' 
                ' btnOk
                ' 
                Me.btnOk.Anchor = System.Windows.Forms.AnchorStyles.Bottom
                Me.btnOk.FlatStyle = System.Windows.Forms.FlatStyle.System
                Me.btnOk.Location = New System.Drawing.Point(148, 168)
                Me.btnOk.Name = "btnOk"
                Me.btnOk.TabIndex = 4
                Me.btnOk.Text = "Ok"
    '           Me.btnOk.Click += New System.EventHandler(Me.btnOk_Click)
                ' 
                ' btnCancel
                ' 
                Me.btnCancel.Anchor = System.Windows.Forms.AnchorStyles.Bottom
                Me.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel
                Me.btnCancel.FlatStyle = System.Windows.Forms.FlatStyle.System
                Me.btnCancel.Location = New System.Drawing.Point(244, 168)
                Me.btnCancel.Name = "btnCancel"
                Me.btnCancel.TabIndex = 5
                Me.btnCancel.Text = "Cancel"
    '           Me.btnCancel.Click += New System.EventHandler(Me.btnCancel_Click)
                ' 
                ' panel1
                ' 
                Me.panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D
                Me.panel1.Controls.Add(Me.cbTransparent)
                Me.panel1.Controls.Add(Me.edPercent)
                Me.panel1.Controls.Add(Me.cbPixelFormat)
                Me.panel1.Controls.Add(Me.label1)
                Me.panel1.Location = New System.Drawing.Point(16, 16)
                Me.panel1.Name = "panel1"
                Me.panel1.Size = New System.Drawing.Size(240, 136)
                Me.panel1.TabIndex = 6
                ' 
                ' panel2
                ' 
                Me.panel2.Anchor = (CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) Or System.Windows.Forms.AnchorStyles.Left) Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles))
                Me.panel2.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D
                Me.panel2.Controls.Add(Me.pictureBox1)
                Me.panel2.Location = New System.Drawing.Point(280, 16)
                Me.panel2.Name = "panel2"
                Me.panel2.Size = New System.Drawing.Size(168, 136)
                Me.panel2.TabIndex = 7
                ' 
                ' pictureBox1
                ' 
                Me.pictureBox1.Dock = System.Windows.Forms.DockStyle.Fill
                Me.pictureBox1.Location = New System.Drawing.Point(0, 0)
                Me.pictureBox1.Name = "pictureBox1"
                Me.pictureBox1.Size = New System.Drawing.Size(164, 132)
                Me.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage
                Me.pictureBox1.TabIndex = 0
                Me.pictureBox1.TabStop = False
                ' 
                ' cbTransparent
                ' 
                Me.cbTransparent.Location = New System.Drawing.Point(16, 88)
                Me.cbTransparent.Name = "cbTransparent"
                Me.cbTransparent.TabIndex = 4
                Me.cbTransparent.Text = "Transparent"
                ' 
                ' TCompressForm
                ' 
                Me.AcceptButton = Me.btnOk
                Me.CancelButton = Me.btnCancel
                Me.AutoScaleDimensions = New System.Drawing.SizeF(6F, 13F)
                Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
                Me.ClientSize = New System.Drawing.Size(472, 214)
                Me.Controls.Add(Me.panel2)
                Me.Controls.Add(Me.panel1)
                Me.Controls.Add(Me.btnCancel)
                Me.Controls.Add(Me.btnOk)
                Me.Name = "TCompressForm"
                Me.Text = "Compression Options..."
    '           Me.Load += New System.EventHandler(Me.TCompressForm_Load)
                CType(Me.edPercent, System.ComponentModel.ISupportInitialize).EndInit()
                Me.panel1.ResumeLayout(False)
                Me.panel2.ResumeLayout(False)
                Me.ResumeLayout(False)
    
            End Sub
            #End Region
        End Class
    End Namespace
    

    TCompressForm.vb

    Imports System.Collections
    Imports System.ComponentModel
    Imports System.IO
    
    Namespace FlexCelImageExplorer
        ''' <summary>
        ''' Summary description for TCompressForm.
        ''' </summary>
        Partial Public Class TCompressForm
            Inherits System.Windows.Forms.Form
    
            Public Sub New()
                '
                ' Required for Windows Form Designer support
                '
                InitializeComponent()
                cbPixelFormat.SelectedIndex = 2
    
                '
                ' TODO: Add any constructor code after InitializeComponent call
                '
            End Sub
    
            Private FImageToUse() As Byte
            Private FXlsFilename As String
    
            Friend Property ImageToUse() As Byte()
                Get
                    Return FImageToUse
                End Get
                Set(ByVal value As Byte())
                    FImageToUse = value
                    Using ms As New MemoryStream(value)
                        pictureBox1.Image = Image.FromStream(ms)
                    End Using
                End Set
            End Property
    
            Friend Property XlsFilename() As String
                Get
                    Return FXlsFilename
                End Get
                Set(ByVal value As String)
                    FXlsFilename = value
                End Set
            End Property
    
            Private Sub btnCancel_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnCancel.Click
                Close()
            End Sub
    
            Private Sub TCompressForm_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
            End Sub
    
            Private Sub btnOk_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnOk.Click
                Close()
            End Sub
        End Class
    End Namespace
    
    In This Article
    Back to top FlexCel Studio for the .NET Framework v7.24.0.0
    © 2002 - 2025 tmssoftware.com