Out of Memory Error w/Image from HBitmap

P

Patrick Dugan

I have a subroutine (posted here) that takes a image from a file and resizes
it and loads it onto a PictureBox.
There is a timer elsewhere that sends the routine a new filename to use.
The routine works fine until the 77th file or so. (The file names are
randomly assigned so they vary each time, but the number of succesful loops
is around 77 before the error is thrown.)
The error is:

Process Image ErrorOutOfMemoryExceptionat
Microsoft.AGL.Common.MISC.HandleAr()
at System.Drawing.Image.FromHbitmap()
at ShowSlide.Form1.ProcessImage()
at ShowSlide.Form1.Timer1_Tick()
at System.Windows.Forms.Timer._WnProc()
at System.Windows.Forms.ApplicationThreadContext._InternalContextMessages()
at Microsoft.AGL.Forms.EVL.EnterMainLoop()
at System.Windows.Forms.Application.Run()
at ShowSlide.Form1.Main()

The error continues to happen each time after that.
Apparently I have a memory leak somewhere that I am not closing but I cannot
tell where.
The code below disposes and closes all objects that can be (as far as I
know)

Does anyone have any ideas why the PDA is running out of memory?
What is being left "open" that is eating memory in this routine?

Any help would be appreciated!

'---------------------------------------------------------

' Get the desktop dimensions...
Dim desktop_wid As Int32 = Me.Width
Dim desktop_hgt As Int32 = Me.Height
PictureBox1.Image = New Bitmap(desktop_wid, desktop_hgt,
Imaging.PixelFormat.Format24bppRgb)
PictureBox1.Width = desktop_wid
PictureBox1.Height = desktop_hgt

' Fill the wallpaper background with the selected color...
Dim gr0 As Graphics = Graphics.FromImage(PictureBox1.Image)
Dim rect1 As New Rectangle(0, 0, PictureBox1.Image.Width,
PictureBox1.Image.Height)
Dim BackgroundColor As New Color
BackgroundColor = Color.Black
gr0.FillRectangle(New SolidBrush(BackgroundColor), rect1)

Dim HBT As New Bitmap(InputFilename)
Dim Hnd As New System.IntPtr
Hnd = HBT.GetHbitmap

Dim img As Image = Image.FromHbitmap(Hnd) '<<<<<<< THIS IS WHERE THE
ERROR OCCURS...>>>>>>>

HBT.Dispose()

' Get the requested image dimensions
Dim image_wid As Int32 = img.Width
Dim image_hgt As Int32 = img.Height

Dim intNewImageWidth As Integer
Dim intNewImageHeight As Integer

Dim TJpegWidth As Integer = CInt((img.Width * desktop_hgt) / img.Height)
Dim TJpegHeight As Integer = CInt((img.Height * desktop_wid) / img.Width)

If desktop_hgt >= desktop_wid Then
If TJpegHeight <= desktop_hgt Then
intNewImageWidth = desktop_wid
intNewImageHeight = CInt(TJpegHeight)
Else
intNewImageWidth = CInt(TJpegWidth)
intNewImageHeight = desktop_hgt
End If
Else
If TJpegHeight <= desktop_hgt Then
intNewImageWidth = desktop_wid
intNewImageHeight = CInt(TJpegHeight)
Else
intNewImageWidth = CInt(TJpegWidth)
intNewImageHeight = desktop_hgt
End If

End If

Dim srcrect As New Rectangle(0, 0, img.Width, img.Height)

Dim destrect As New Rectangle( _
CInt((desktop_wid - intNewImageWidth) \ 2), _
CInt((desktop_hgt - intNewImageHeight) \ 2), _
CInt(intNewImageWidth), _
CInt(intNewImageHeight))

gr0.DrawImage(img, destrect, srcrect, GraphicsUnit.Pixel)
PictureBox1.Refresh()

img.Dispose()
gr0.Dispose()
 
P

Patrick Dugan

Well using that code example in the compact framework compiled without error


<System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")> _
Private Shared Function DeleteObject(ByVal hObject As IntPtr) As Boolean
End Function



however during execution it throws the error:


1/15/08 2:29:04 PM == Process Image ErrorCan't find PInvoke DLL
'gdi32.dll'.at ShowSlide.Form1.ProcessImage()
at ShowSlide.Form1.Timer1_Tick()
at System.Windows.Forms.Timer._WnProc()
at System.Windows.Forms.ApplicationThreadContext._InternalContextMessages()
at Microsoft.AGL.Forms.EVL.EnterMainLoop()
at System.Windows.Forms.Application.Run()
at ShowSlide.Form1.Main()


I take it I cannot use the method in the compact framework or is there
something I am missing?
 
P

Patrick Dugan

Found an answer.
Basically don't use the hgetbitmap at all

Went from this:

to this:


Dim img As Image = New Bitmap(InputFilename)


Much easier and no memory errors anymore.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top