Link to home
Start Free TrialLog in
Avatar of mwinder
mwinder

asked on

Out of memory error loading form backgroundimage

Man, I'm starting to feel abused.  This shouldn't be hard:

' stub test code to load an image into memory and create a bitmap from it

           Dim memoryStream As New System.IO.MemoryStream
            Image.FromFile("C:\Anthony.jpg").Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg)
            Dim Buffer As Byte() = memoryStream.GetBuffer()
            Dim picStr As String = Convert.ToBase64String(Buffer)
            memoryStream.Close()
            Dim memoryStream2 As New System.IO.MemoryStream(Convert.FromBase64String(picStr))
            Dim icon As New System.Drawing.Bitmap(memoryStream2)
            memoryStream2.Close()

' Test picture box
            PictureBox1.Image = icon

' The real code
            Me.BackgroundImage = icon       ' New Bitmap("c:\Anthony.jpg")


When I run this code in the form load event I get an out of memory error setting the background image:

An unhandled exception of type 'System.OutOfMemoryException' occurred in system.windows.forms.dll

Additional information: Out of memory.

If I comment out the background image the picture box displays the same bitmap just fine.  So I'm thinking the bitmap is OK.  But if I change the background image to use the commented out "New Bitmap..." code the backgroundimage works.  So what is it about the combination of backgroundimage and the dynamically created bitmap that is causing the memory error?

Avatar of mwinder
mwinder

ASKER

I wrapped try catch blocks around my code and the error actually happens AFTER the form load function returns.  The forms begins to display on the screen and the "Out of memory" error appears.  

I tried stepping to the offending code with the debugger and could not.  The error appears immediately after leaving the form load function.
Hi mwinder,
>             Dim memoryStream2 As New System.IO.MemoryStream(Convert.FromBase64String(picStr))

From a superficial look, I think this is the line that is causing you grief.

Maybe it will help if you can post the whole code for the form (if it is not to big) so that I can try it out on my system.

Dabas
Avatar of mwinder

ASKER

Public Class Form1
    Inherits System.Windows.Forms.Form

#Region " Windows Form Designer generated code "

    Public Sub New()
        MyBase.New()

        'This call is required by the Windows Form Designer.
        InitializeComponent()

        'Add any initialization after the InitializeComponent() call

    End Sub

    'Form overrides dispose to clean up the component list.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    'Required by the Windows Form Designer
    Private components As System.ComponentModel.IContainer

    'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified using the Windows Form Designer.  
    'Do not modify it using the code editor.
    Friend WithEvents PictureBox1 As System.Windows.Forms.PictureBox
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.PictureBox1 = New System.Windows.Forms.PictureBox
        Me.SuspendLayout()
        '
        'PictureBox1
        '
        Me.PictureBox1.Location = New System.Drawing.Point(104, 56)
        Me.PictureBox1.Name = "PictureBox1"
        Me.PictureBox1.Size = New System.Drawing.Size(160, 192)
        Me.PictureBox1.TabIndex = 0
        Me.PictureBox1.TabStop = False
        '
        'Form1
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
        Me.ClientSize = New System.Drawing.Size(440, 365)
        Me.Controls.Add(Me.PictureBox1)
        Me.Name = "Form1"
        Me.Text = "Form1"
        Me.ResumeLayout(False)

    End Sub

#End Region

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' stub test code to load an image into memory and create a bitmap from it
        Dim icon As System.Drawing.Bitmap
        Try
            Dim memoryStream As New System.IO.MemoryStream
            Image.FromFile("C:\test.jpg").Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg)
            Dim Buffer As Byte() = memoryStream.GetBuffer()
            Dim picStr As String = Convert.ToBase64String(Buffer)
            memoryStream.Close()
            Dim memoryStream2 As New System.IO.MemoryStream(Convert.FromBase64String(picStr))
            icon = New System.Drawing.Bitmap(memoryStream2)
            memoryStream2.Close()
        Catch ex3 As Exception
            Console.WriteLine(ex3.ToString)
        End Try

        ' Test picture box
        Try
            PictureBox1.Image = icon
        Catch ex2 As Exception
            Console.WriteLine(ex2.ToString)
        End Try

        ' The real code
        Try
            Me.BackgroundImage = icon    ' New Bitmap("c:\test.jpg")
        Catch ex As Exception
            Console.WriteLine(ex.ToString)
        End Try

    End Sub
End Class
ASKER CERTIFIED SOLUTION
Avatar of Dabas
Dabas
Flag of Australia image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of Bob Learned
No comment has been added lately, so it's time to clean up this TA.
I will leave the following recommendation for this question in the Cleanup topic area:

Accept: Dabas {http:#9719512}

Please leave any comments here within the next seven days.
PLEASE DO NOT ACCEPT THIS COMMENT AS AN ANSWER!

TheLearnedOne
EE Cleanup Volunteer
Avatar of mwinder

ASKER

Dabas recreated my problem, but didn't offer a solution.  He suggested there might be a conversion problem, but did not point out where.  I don't mind if you want to close this, and I don't mind if you want to give Dabas credit for responding (I appreciate the try), but I do not think his answer is correct.
Avatar of mwinder

ASKER

My comment came across poorly.  Dabas's answer's may be correct, but it did not solve my problem.  If there is a bug in my code it would be nice to know where it is.  I have seen the same code used in other (working) applications.

If the problem is the form is being recreated, is there a workaround?  I could not find one, which is why I posted the question.