Quantcast
Channel: Visual Basic Tips and Tricks
Viewing all articles
Browse latest Browse all 2212

Memoria insufficente durante rotazione immabine in picturebox

$
0
0

Ciao a tutti spero gli illuminati possano portare un pò di luce anche in questa situazione.

Situazione : 

carico in una picturebox un immagine BMP con dimensioni non indifferenti 56 Mb circa.

Tramite questo codice (trovato in giro) effettuo una rotazione avendo fissato come valori un range abbastanza piccolo (da -5 a +5 , partendo da centrata verso destra e verso sinistra)

originale è la picturebox contenente l'immagine caricata dal file.

        Try

            Dim bm_in As New Bitmap(originale.Image)
            Dim wid As Single = bm_in.Width
            Dim hgt As Single = bm_in.Height
            Dim corners As Point() = {
            New Point(0, 0),
            New Point(wid, 0),
            New Point(0, hgt),
            New Point(wid, hgt)}
            Dim cx As Single = wid / 2
            Dim cy As Single = hgt / 2
            Dim i As Long
            For i = 0 To 3
                corners(i).X -= cx
                corners(i).Y -= cy
            Next i

            Dim theta As Single = Single.Parse(HScrollBar1.Value.ToString) * PI / 180.0
            Dim sin_theta As Single = Sin(theta)
            Dim cos_theta As Single = Cos(theta)
            Dim X As Single
            Dim Y As Single
            For i = 0 To 3
                X = corners(i).X
                Y = corners(i).Y
                corners(i).X = X * cos_theta + Y * sin_theta
                corners(i).Y = -X * sin_theta + Y * cos_theta
            Next i

            Dim xmin As Single = corners(0).X
            Dim ymin As Single = corners(0).Y
            For i = 1 To 3
                If xmin > corners(i).X Then xmin = corners(i).X
                If ymin > corners(i).Y Then ymin = corners(i).Y
            Next i
            For i = 0 To 3
                corners(i).X -= xmin
                corners(i).Y -= ymin
            Next i

            Dim bm_out As New Bitmap(CInt(-2 * xmin), CInt(-2 * ymin))
            Dim gr_out As Graphics = Graphics.FromImage(bm_out)
            ReDim Preserve corners(2)
            gr_out.DrawImage(bm_in, corners)
            If Not picDest.Image Is Nothing Then
                picDest.Image.Dispose()
            End If
            picDest.Image = bm_out

        Catch ex As Exception
            MsgBox("Si è verificato un errore durante l'elaborazione dell'immagine : "& ex.Message)
        End Try

 

naturalmente l'immagine in uscita viene impostata su picDest(un altra picturebox)

Ho provato a piazzare un dispose prima di 'reimpostare' l'immagine in picDest prima che venga nuovamente ruotata in un senso o nell'altro. Scorrendo la barra 'hscroll1' che assegna il valore di rotazione da -5 a 5, solo dopo diverse volte (alcune volte anche una ventina) ricevo l'errore  'parametro non valido' e poi 'memoria insufficiente' altre volte invece solo l'errore 'memoria insufficiente'.

Potreste darmi un mano a trovare l'errore ? o semplicemente immagini di una certa dimensione non andrebbero utilizzate ?

Non capisco perchè se caricata l'immagine la prima volta e avendo piazzato picDest.image.dispose dopo un pò di volte si presenta questo errore.

Spero in un suggerimento e come sempre grazie mille.


Viewing all articles
Browse latest Browse all 2212