IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Bitmap Erreur Mémoire insuffisante


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 117
    Par défaut Bitmap Erreur Mémoire insuffisante
    Bonjour, j'essai de faire un visionneur d'un morceau d'une image d'où est placé le curseur (afin d'être précis).

    J'ai une erreur lors du déplacement de la souris "Mémoire insuffisante" si celle-ci touche les bords de l'image mais toujours pareil.

    J'ai donc fait des conditions si le Rectangle est plus grand/petit que l'image on recadre le rectangle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    Imports System.Drawing
    Public Class Form1
     
        Public tmpBMP As Bitmap
        Public cloBMP As Bitmap
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            tmpBMP = New Bitmap(PictureBox1.Image)
            cloBMP = New Bitmap(210, 210)
        End Sub
     
        Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
     
            Label1.Text = CStr(e.Location.X) + " - " + CStr(e.Location.Y)
     
            Dim x As Int16 = e.Location.X - 105
            Dim y As Int16 = e.Location.Y - 105
     
            If x <= 0 Then x = 0
            If y <= 0 Then y = 0
     
            If x >= tmpBMP.Width Then x = tmpBMP.Width
            If y >= tmpBMP.Height Then y = tmpBMP.Height
     
            Dim rec As New Rectangle(x, y, 210, 210)
     
            cloBMP = tmpBMP.Clone(rec, tmpBMP.PixelFormat)
     
            Dim gra As Graphics = Graphics.FromImage(cloBMP)
            gra.DrawLine(Pens.Red, 0, CInt(cloBMP.Height / 2), cloBMP.Width, CInt(cloBMP.Height / 2))
            gra.DrawLine(Pens.Red, CInt(cloBMP.Width / 2), 0, CInt(cloBMP.Width / 2), cloBMP.Height)
     
            gra.Dispose()
            PictureBox2.Image = cloBMP
        End Sub
     
     
    End Class
    PS: j'ai pas pu mettre la source en zip, (+ de 2Mo) désolé.

    Voila, merci d'avance.

  2. #2
    Membre Expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Par défaut
    Yep pour mettre la source, supprime l'exe et tous les fichiers se trouvant dans le répertoire bin de ton projet
    Articles sur les technologies .NET

    Une réponse vous a aidé ? utilisez le bouton

    Votre problème est résolu ? utilisez le bouton

  3. #3
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    sur un déplacement de souris mousemove peut etre déclenché très souvent
    la classe bitmap implémente IDisposable, ce qui veut dire que cette classe utilise de la mémoire via windows, et qu'on peut donc forcer sa destruction pour libérer la mémoire
    dans la plupart des cas un débutant peut se permettre de ne pas connaitre ce fonctionnement (il y a un système automatique mais retardé), mais quand on créé potentiellement plein de bitmaps il faut détruire ceux qui ne sont plus utilisés, sinon on peut rapidement arriver au OutOfMemoryException

    une des possibilités :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If PictureBox2.Image IsNot Nothing Then PictureBox2.Image.Dispose
    PictureBox2.Image = cloBMP
    le mieux quand on dessine souvent c'est de dessiner sur le controle plutot que de créer une image à chaque fois en la mettant dans la propriété du picturebox, c'est beaucoup plus performant (voir la méthode invalidate et l'event paint)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour Guyome41
    J'ai une erreur lors du déplacement de la souris "Mémoire insuffisante" si celle-ci touche les bords de l'image mais toujours pareil.
    Pas etonnant vu la maniere dont tu geres ton rectangle de 210x210
    Quand tu codes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            If x >= tmpBMP.Width Then x = tmpBMP.Width
            If y >= tmpBMP.Height Then y = tmpBMP.Height
            Dim rec As New Rectangle(x, y, 210, 210)
            cloBMP = tmpBMP.Clone(rec, tmpBMP.PixelFormat)
    Ton rectangle est hors du bitmap à gauche(1er cs) ou à droite (2e cas) car:

    1/ les limites du bitmap sont tmpBMP.Width-1 & tmpBMP.Height-1...
    2/ Ensuite le test doit porter sur les props Rectangle.Right(le x) et Rectangle.Bottom(le y) qui decrivent la "tete avancee" du rectangle.......

    D'ou le "boggus" OutOfMemory exception.....car Clone.BitMap attend une zone memoire bitmap et ta zone est en dehors et contient autre chose ....

    le code lifte compends en plus un panel scrollable qui contiendra ton picture source (avec son imageà) pour mieux "voir" que le rectangle viseur est bien dans les limites du bitmap.......
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
           ' ---------Ajouter
    '1/ --------- un Panel scrollable au form ------------------
    '2/  -------- le PictureBox Source "au" Panel-----------
    '3/  -------- le 2 PictureBox (contenant "zone clonee") au form-----------
    '4/  -------- un ToolTip sur le form au loeur du Label
    Imports System.Drawing.Imaging
    Public Class Form3
        Public tmpBMP As Bitmap = Nothing
        Public cloBMP As Bitmap = Nothing
        'declare le rectangle viseur au niveu form:
        Private viseurRec As Rectangle = New Rectangle(0, 0, 210, 210)
        Public Sub New()
     
            ' Cet appel est requis par le concepteur.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            '---------Panel scrollable
            Me.Panel1.AutoScroll = True
            Me.Panel1.AutoScrollMinSize = New Size(1024, 768)
     
            '---------Definit  mode de "clipping" des 2 PictureBoxs  
            PictureBox1.SizeMode = PictureBoxSizeMode.AutoSize
            PictureBox2.SizeMode = PictureBoxSizeMode.Normal
     
            '---------DoubleBuffering pour eviter le "scintillement" lors du dessin du viseur 
            '---------sur le PictureBox Source
     
            Me.DoubleBuffered = True
        End Sub
        Private Sub Form3_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            '---------recupere image 
            PictureBox1.Image = My.Resources.Nenuphars
            tmpBMP = New Bitmap(PictureBox1.Image)
            cloBMP = New Bitmap(210, 210)
        End Sub
        Private Sub PictureBox1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
     
            Label1.Text = CStr(e.Location.X) + " - " + CStr(e.Location.Y)
     
            Dim x As Int32 = e.X - 105
            Dim y As Int32 = e.Y - 105
            '----------------init viseurRec
            viseurRec = New Rectangle(x, y, 210, 210)
     
            '----------------1er test sur  viseurRec
            If viseurRec.X <= 0 Then viseurRec.X = 0
            If viseurRec.Y <= 0 Then viseurRec.Y = 0
     
            '------2e test sur les "diaboliques" viseurRec et bitmap source
            'NB : tmpBMP.Width - 1 & tmpBMP.Height - 1
            'NB : props utiles du Rectangle : Right et Bottom(eclaireurs)
            'Right est mis à jour "auto" quand on modifie Rectangle.X 
            ' Idem pour Bottom & Rect.Y 
     
            If viseurRec.Right >= (tmpBMP.Width - 1) Then
                ' soustraire le depassement en agissant sur rectangle.X
                viseurRec.X = viseurRec.X - (viseurRec.Right - (tmpBMP.Width - 1))
            End If
            If viseurRec.Bottom >= (tmpBMP.Height - 1) Then
                viseurRec.Y = viseurRec.Y - (viseurRec.Bottom - (tmpBMP.Height - 1))
            End If
     
     
            ToolTip1.SetToolTip(PictureBox1, viseurRec.Right.ToString + " - " + viseurRec.Bottom.ToString)
     
            'Out " the boggus"
            cloBMP = tmpBMP.Clone(viseurRec, tmpBMP.PixelFormat)
     
            Dim gra As Graphics = Graphics.FromImage(cloBMP)
            gra.DrawLine(Pens.Red, 0, CInt(cloBMP.Height / 2), cloBMP.Width, CInt(cloBMP.Height / 2))
            gra.DrawLine(Pens.Red, CInt(cloBMP.Width / 2), 0, CInt(cloBMP.Width / 2), cloBMP.Height)
     
     
     
            gra.Dispose()
            PictureBox2.Image = cloBMP
     
     
            'refresh  PictureBox1 (car je dessine egalement  mon viseur sur PictureBox Source)
            PictureBox1.Refresh()
     
        End Sub
        Private Sub PictureBox1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
            Dim gra As Graphics = e.Graphics
            Dim bigPen As Pen = New Pen(Brushes.Yellow, 4.0)
            gra.DrawRectangle(bigPen, viseurRec)
            bigPen.Dispose()
     
        End Sub
     
     
    End Class
    De plus sache, comme dit par Pol63,que ton Bitmap.Clone contient une reference directe sur la "zone" du bitmap source et il faut donc faire attention à la manipulation de ce rectangle.....
    bon code..................................

Discussions similaires

  1. Réponses: 8
    Dernier message: 07/07/2010, 09h58
  2. Erreur "mémoire insuffisante" lors de la lecture d'un film
    Par nyme92 dans le forum Installation
    Réponses: 5
    Dernier message: 21/12/2008, 20h19
  3. Message d'erreur : "Mémoire insuffisante [..]"
    Par mcroz dans le forum Access
    Réponses: 8
    Dernier message: 01/03/2007, 17h14
  4. Erreur mémoire insuffisante
    Par jpp81 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 27/01/2007, 07h31
  5. message d'erreur "Mémoire insuffisante"
    Par jakouz dans le forum Langage
    Réponses: 3
    Dernier message: 25/10/2005, 14h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo