I was able to solve this problem in my application.
Jason has the answer, you have to make sure you use the "use" of the blocks or their equivalent.
I use VB, and the equivalent was to use Try ... Catch ... Finally, when I created a new bitmap, calling BitMap.
This is apparently a very common problem, judging by the hours I spent trying Google. The code below also allows any image to maintain aspect ratio when reduced to a thumbnail, which is even worse than Google!
code:
Private Function AspectedImage(ByVal ImagePath As String, ByVal SizeWanted As Integer) As Image Dim myBitmap, WhiteSpace As System.Drawing.Bitmap Dim myGraphics As Graphics Dim myDestination As Rectangle Dim MaxDimension As Integer Dim ReductionRatio As Double Try 'create an instance of bitmap based on a file myBitmap = New System.Drawing.Bitmap(ImagePath) 'create a new square blank bitmap the right size If myBitmap.Height >= myBitmap.Width Then MaxDimension = myBitmap.Height Else MaxDimension = myBitmap.Width ReductionRatio = SizeWanted / MaxDimension WhiteSpace = New System.Drawing.Bitmap(SizeWanted, SizeWanted) 'get the drawing surface of the new blank bitmap myGraphics = Graphics.FromImage(WhiteSpace) 'find out if the photo is landscape or portrait Dim WhiteGap As Double If myBitmap.Height > myBitmap.Width Then 'portrait WhiteGap = ((myBitmap.Width - myBitmap.Height) / 2) * -1 myDestination = New Rectangle(x:=CInt(WhiteGap * ReductionRatio), y:=0, Width:=Int(myBitmap.Width * ReductionRatio), Height:=Int(myBitmap.Height * ReductionRatio)) Else 'landscape WhiteGap = ((myBitmap.Width - myBitmap.Height) / 2) 'create a destination rectangle myDestination = New Rectangle(x:=0, y:=CInt(WhiteGap * ReductionRatio), Width:=Int(myBitmap.Width * ReductionRatio), Height:=Int(myBitmap.Height * ReductionRatio)) End If 'draw the image on the white square myGraphics.DrawImage(image:=myBitmap, rect:=myDestination) AspectedImage = WhiteSpace Catch ex As Exception myBitmap = New System.Drawing.Bitmap("") AspectedImage = New System.Drawing.Bitmap(4, 4) ImageBufferExceeded = True MsgBox("Image Buffer exceeded, too many images in memory. If the one(s) you want can't be seen, please restart the application and navigate straight to your images") Finally myBitmap.Dispose() myBitmap = Nothing WhiteSpace = Nothing End Try End Function
peaveyyyy
source share