2009-10-15 5 views
0

Ce code fonctionne correctement et peut être appelé plusieurs fois sans problème. Cependant, si la bitmap est redimensionnée (agrandie), j'obtiens une violation d'accès. Ce n'est pas le cas si le bimap est réduit.Violation d'accès à la mémoire C#

Je peux confirmer que la taille de la matrice de bitmap BMPSize & BitmapBytes à tout moment.

Quelqu'un peut-il répandre la lumière sur ceci, s'il vous plaît?

public void SetBitmap(Bitmap bmp) 
    { 
     UInt32 BMPSize = Convert.ToUInt32(bmp.Height * bmp.Width * 4); 
     BMPSize += 0x36; 

     if (!FileMappingCreated) 
     { 
      MemoryFileHandle = CreateFileMapping((IntPtr)0, (IntPtr)0, 
       PageProtection.ReadWrite, 0, BMPSize, SharedName); 

      if (MemoryFileHandle != null) 
      { 
       SetNamedSecurityInfo(SharedName, SE_OBJECT_TYPE.SE_KERNEL_OBJECT, SECURITY_INFORMATION.DACL_SECURITY_INFORMATION, 
        IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); 


       ViewFile = MapViewOfFile(MemoryFileHandle, FILE_MAP_WRITE, 0, 0, 0); 


       if (MemoryFileHandle == IntPtr.Zero) 
       { 
        CloseHandle(MemoryFileHandle); 
       } 
       else 
       { 
        FileMappingCreated = true; 
       } 
      } 
     } 

     MemoryStream stream = new MemoryStream();   

     bmp.Save(stream, ImageFormat.Bmp); 

     byte[] BitmapBytes = stream.ToArray(); 

     // BMP SIZE Value 4bytes long see internet for DIB structure. 
     byte[] DIBImageSize = null; 
     int ImageSizeAddress = 0x22; 

     DIBImageSize = BitConverter.GetBytes(Convert.ToInt32(BMPSize)); 

     // put DIBImageSize into array starting at address 0x22 
     for (int i = 0; i < DIBImageSize.Length; i++) 
     { 
      BitmapBytes[ImageSizeAddress] = DIBImageSize[i]; 
      ImageSizeAddress++; 
     } 

     // THIS IS THE LINE THAT FAILS 
     Marshal.Copy(BitmapBytes, 0, ViewFile, Convert.ToInt32(BMPSize));   

     BitmapBytes = null; 
     DIBImageSize = null; 
     FileMappingCreated = false; 
    } 

Un grand merci à tous.

PyroPaul

Répondre

0

peut confirmer que le décompte de la taille du tableau BMPSize & de BitmapBytes à tous les fois.

C'est deux des trois paramètres.

+0

Je suis probablement un peu épais ici. De quel 3e paramètre parlez-vous? Si c'est ViewFile, cela changera chaque boucle pendant que j'efface (à false) FileMappingCreated. – user183185

+0

"Si c'est ViewFile, cela va changer chaque boucle" - Non ce ne sera pas. Vérifiez les poignées dans le débogueur. – ima

+0

Désolé, j'ai oublié d'ajouter que toutes les variables changent avec le redimensionnement et, par conséquent, les variables dans Marshal.Copy. Il ne s'agit pas, dans ce cas, de conserver la taille et les erreurs d'origine au moment où il écrase la taille définie lors de la première exécution. – user183185

1

Comme je sais, la taille de bitmap est également limitée par la capacité de la carte d'affichage. Nous ne dépassons normalement aucune taille de texture/bitmap supérieure à 1024 x 1024px. Des erreurs étranges se produiront si votre bitmap est plus grand que cette taille.

Quelle est la taille de votre bitmap? Essayez de le couper en morceaux pour le charger morceau par morceau.

+0

Merci pour votre réponse très rapide. Je viens de redimensionner le bmp de 355k à 467k et je reçois cette violation. Tout ce qui est en dessous de 355k ira bien. Si à la première utilisation, le bitmap est, disons, 900k alors tant que je ne redimensionne pas au-dessus, tout fonctionne bien. Ceci est appelé plusieurs fois par l'application et échoue uniquement lors du redimensionnement d'un bitmap plus grand à partir de la taille initiale au démarrage – user183185

Questions connexes