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 :

PictureBox/Image -> Out of Memory


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de Neiflheim
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2011
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2011
    Messages : 135
    Par défaut PictureBox/Image -> Out of Memory
    Bonjour à tous,

    Alors j'ai lu tous les sujets sur ce problème mais aucun ne répond à mon besoin.

    J'ai besoin de créer virtuellement une image de 10.000px x 10.000px Puis de faire un traitement dessus pour rajouter des lignes, des points...

    Cependant ça bug directement lors de la création de l'image en mémoire.

    Alors ma question est : comment créer un bitmap (ou autre du moment que je peux afficher l'image finale dans un controle picture box ou image en wpf) d'une telle taille?

    Merci d'avance pour vos réponses

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    291
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 291
    Par défaut
    Bonjour,

    Cela demande quelques précisions.

    Quelle profondeur de couleur ? 1 bit, 8 bit 24 bits 32 bits ??

    Comment créez vous cette image ? (un petit bout de code serait sympa)

    Ceci dit pour des images de grandes tailles il y a effectivement un petit pb de mémoire avec le garbage collector.
    Pour palier à ceci l'idée est de revenir aux sources : le DIB et ça fonctionne.

  3. #3
    Membre expérimenté Avatar de Neiflheim
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2011
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2011
    Messages : 135
    Par défaut
    Merci de ta réponse

    Alors pour information je n'ai pas du tout le langage informaticien, car c'est pas mon job, mais je vais essayer d'être le plus précis possible.

    Pour la profondeur de couleur je pense que c'est du 32bits vu que c'est des codes couleurs RGBA?

    Voici un bout de code :

    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
     
     Dim objBitMap As New System.Drawing.Bitmap(10000, 10000)
            Dim objGraphics As System.Drawing.Graphics
            objGraphics = System.Drawing.Graphics.FromImage(objBitMap)
            objGraphics.Clear(System.Drawing.Color.DarkOliveGreen)
            Dim i As Integer
     
            Dim FR() As DataRow = DataTableVillage.Select(*******)
            Dim customColor As System.Drawing.Color = System.Drawing.Color.Red
            Dim MaBrush = New System.Drawing.SolidBrush(customColor)
            Dim MonRectable As System.Drawing.Rectangle
     
            For i = 0 To FR.GetUpperBound(0) - 1
                MonRectable = New System.Drawing.Rectangle(FR(i).Item("X"), FR(i).Item("Y"), 1, 1)
                objGraphics.FillRectangle(MaBrush, MonRectable)
            Next
     
                 Carte.Source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(objBitMap.GetHbitmap(), IntPtr.Zero, System.Windows.Int32Rect.Empty, BitmapSizeOptions.FromWidthAndHeight(10000, 10000))
    Merci pour ton aide

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    291
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 291
    Par défaut
    Bonjour,

    Pour la profondeur de couleur je pense que c'est du 32bits vu que c'est des codes couleurs RGBA?
    Oui.

    Bon cela fait qu'en mémoire ton bitmap pour la zone de données représente :
    10 000* 4 octet * 10 000 = 400 Mo mais il n'y a rien d'ingérable.

    je n'ai pas du tout le langage informaticien, car c'est pas mon job
    Là ça va être plus difficile d'expliquer comment faire car cela fait appel à des notions un peu complexes.

    Un DIB est un bitmap indépendant du périphérique. Qui est décrit par une structure BITMAPINFO et un tableau d'octets contenant les "pixels" de ton 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
    <StructLayout(LayoutKind.Explicit)> Public Structure BITMAPINFOHEADER
            <FieldOffset(0)> Public biSize As Int32
            <FieldOffset(4)> Public biWidth As Int32
            <FieldOffset(8)> Public biHeight As Int32
            <FieldOffset(12)> Public biPlanes As Int16
            <FieldOffset(14)> Public biBitCount As Int16
            <FieldOffset(16)> Public biCompression As Int32
            <FieldOffset(20)> Public biSizeImage As Int32
            <FieldOffset(24)> Public biXPelsperMeter As Int32
            <FieldOffset(28)> Public biYPelsPerMeter As Int32
            <FieldOffset(32)> Public biClrUsed As Int32
            <FieldOffset(36)> Public biClrImportant As Int32
        End Structure
     
        <StructLayout(LayoutKind.Sequential)> Public Structure RGBQUAD
            Public rgbBlue As Byte
            Public rgbGreen As Byte
            Public rgbRed As Byte
            Public rgbReserved As Byte
        End Structure
     
        <StructLayout(LayoutKind.Sequential)> Public Structure BITMAPINFO
            Public bmiHeader As BITMAPINFOHEADER
            <MarshalAs(UnmanagedType.ByValArray, sizeconst:=256)> Public bmiColors() As RGBQUAD
        End Structure
    Pour dessiner ce DIB il faut ensuite utiliser l'API WIN32:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Declare Function StretchDIBits Lib "gdi32" (ByVal hdc As IntPtr, ByVal x As Intptr, ByVal y As Intptr, ByVal dx As Intptr, ByVal dy As Intptr, ByVal SrcX As Intptr, ByVal SrcY As Intptr, ByVal wSrcWidth As Intptr, ByVal wSrcHeight As Intptr, ByVal lpBits As IntPtr, ByRef lpBitsInfo As BITMAPINFO, ByVal wUsage As UIntptr, ByVal dwRop As UIntptr) As Intptr
    où lpBits sera un pointeur vers le premier élément de ton tableau.

    Pour dimensionner ton tableau il faut que chaque ligne horizontale de l'image soit alignée sur 32 bits, donc en fonction de la profondeur de couleur cela change.

    Pour créer ton tableau le plus simple est d'utiliser l'interopservice et son marshall pour allouer une zone mémoire de la taille voulue.

    Pour tout cela tu peux t'inspirer de ce post:

    http://www.developpez.net/forums/d10...-image-bitmap/

    Mais tout cela n'est pas trivial ...

  5. #5
    Membre expérimenté Avatar de Neiflheim
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2011
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2011
    Messages : 135
    Par défaut
    Merci pour cette réponse précise.

    Dans l'immédiat, je dirais que ça ne me fais pas peur d'approfondir cette méthode qui n'a pas l'air simple, j'ai appris le vb.net winforms puis wpf en moins de deux mois, donc apprendre ne me fais pas peur.

    Cependant, j'aimerais savoir niveau performance ce que je pourrais obtenir.

    Avec le code que j'ai indiqué si dessus, créer une image de 10.000px x 10.000px, et en dessinant 400.000points dessus, puis l'afficher prendrait combien de secondes avec cette méthode?

    (Avec le même code mais sur une image de 1000 x 1000, j'obtiens le résultat en environ 2-3 secondes, j'espère trouver une méthode aussi rapide si ce n'est +)

Discussions similaires

  1. image.fromfile Out Of Memory Exception
    Par jerem7w dans le forum VB.NET
    Réponses: 6
    Dernier message: 10/03/2019, 08h22
  2. Réponses: 8
    Dernier message: 21/03/2013, 13h32
  3. Tableau d'images et ACP out of memory
    Par soeursourire dans le forum Images
    Réponses: 6
    Dernier message: 08/02/2008, 12h03
  4. "out of memory exception" sur un picturebox[VB 2005.net]
    Par philippe carel dans le forum Windows Forms
    Réponses: 6
    Dernier message: 23/07/2006, 14h36
  5. [JBuilder 8] Out of memory problem ...
    Par keros dans le forum JBuilder
    Réponses: 2
    Dernier message: 08/09/2003, 19h03

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